Javascript 什么决定了从Object.getOwnPropertySymbols返回的符号的顺序?

Javascript 什么决定了从Object.getOwnPropertySymbols返回的符号的顺序?,javascript,ecmascript-6,symbols,Javascript,Ecmascript 6,Symbols,ES2015在对象,getOwnPropertySymbols上定义了一个新方法。我正在使用它从我拥有的对象获取所有符号键: let syms = Object.getOwnPropertySymbols(myObj); 在此之前,我的操作假设返回顺序是通过对符号的字符串版本进行排序来确定的。快速测试表明这是错误的: let obj = {}; obj[Symbol('Stack')] = 'Stack'; obj[Symbol('Overflow')] = 'Overflow'; Objec

ES2015在
对象
getOwnPropertySymbols
上定义了一个新方法。我正在使用它从我拥有的对象获取所有符号键:

let syms = Object.getOwnPropertySymbols(myObj);
在此之前,我的操作假设返回顺序是通过对符号的字符串版本进行排序来确定的。快速测试表明这是错误的:

let obj = {};
obj[Symbol('Stack')] = 'Stack';
obj[Symbol('Overflow')] = 'Overflow';
Object.getOwnPropertySymbols(obj); // [ Symbol(Stack), Symbol(Overflow) ]

这是如何确定的?是按照它们添加到全局符号注册表的顺序,还是像普通的
对象那样“随机”。键

每个JavaScript对象都有一个名为的内部跟踪器。这是跟踪对象、字符串或符号的所有关键点的列表。当您调用
getOwnPropertySymbols
时,会发生以下情况:

  • 所有的
    getOwnPropertySymbols
    都是使用
    (O,Symbol)
    []调用内部
    GetOwnPropertyKeys
  • GetOwnPropertyKeys
    遍历OwnPropertyKeys,如果所述键是一个符号,则将它们添加到数组中(因为我们使用上面的
    symbol
    对其进行了调用)。[…]
  • 返回之前创建的数组
  • 现在至少我们知道幕后发生了什么,但这是如何决定秩序的呢?关键点是,
    OwnPropertyKeys
    是按键添加到对象的顺序排序的。因此,这与符号添加到注册表的时间无关,如下所示:

    let symO = Symbol('Overflow');
    let symS = Symbol('Stack');
    let obj = {};
    obj[symS] = 'Stack';
    obj[symO] = 'Overflow';
    console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol(Stack), Symbol(Overflow) ]
    

    即使我们以相反的顺序声明符号,所有
    getOwnPropertySymbols
    关心的是它们添加到对象中的顺序。

    插入顺序,就像其他属性一样,除了可扩展键,它们是数字排序的,但它们不是符号,所以只需插入即可。@dandavis这是一个自我回答,检查下面我的答案!“如果我错过了什么,请告诉我你为什么要那样做?”丹达维斯这样他就可以分享他所做的learned@dandavis正如尼克所说,这样我就可以分享我学到的东西。这比一篇完整的博客文章要快(而且更有可能帮助人们)。看见