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

时间:2015-11-13 23:16:05

标签: javascript ecmascript-6 symbols

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

let syms = Object.getOwnPropertySymbols(myObj);

之前,我的假设是通过对符号的字符串版本进行排序来确定退货订单。快速测试显示错误:

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

这是如何确定的?是它们被添加到全局Symbol注册表中的顺序,还是像常规Object.keys一样“随机”?

1 个答案:

答案 0 :(得分:2)

每个JavaScript对象都有一个名为OwnPropertyKeys的内部跟踪器。这是一个跟踪对象,字符串或符号的所有键的List。当你致电getOwnPropertySymbols时,会发生以下情况:

  1. 所有getOwnPropertySymbols所做的就是使用GetOwnPropertyKeys [spec]调用内部(O, Symbol)
  2. GetOwnPropertyKeys遍历OwnPropertyKeys,如果所述密钥是一个符号,则将它们添加到数组中(因为我们在上面使用Symbol调用它)。 [spec]。
  3. 返回之前创建的数组。
  4. 现在至少我们知道幕后发生了什么,但这又如何决定秩序?关键是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关心的是它们被添加到对象的顺序。