ES2015在Object
,getOwnPropertySymbols
上定义了一种新方法。我正在使用它从我拥有的对象中获取所有符号键:
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
一样“随机”?
答案 0 :(得分:2)
每个JavaScript对象都有一个名为OwnPropertyKeys的内部跟踪器。这是一个跟踪对象,字符串或符号的所有键的List。当你致电getOwnPropertySymbols
时,会发生以下情况:
getOwnPropertySymbols
所做的就是使用GetOwnPropertyKeys
[spec]调用内部(O, Symbol)
。GetOwnPropertyKeys
遍历OwnPropertyKeys,如果所述密钥是一个符号,则将它们添加到数组中(因为我们在上面使用Symbol
调用它)。 [spec]。现在至少我们知道幕后发生了什么,但这又如何决定秩序?关键是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
关心的是它们被添加到对象的顺序。