【问题标题】:What determines the order of Symbols returned from Object.getOwnPropertySymbols?什么决定了从 Object.getOwnPropertySymbols 返回的 Symbols 的顺序?
【发布时间】:2016-02-15 15:43:13
【问题描述】:

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

let syms = Object.getOwnPropertySymbols(myObj);

以前,我在假设返回顺序是通过对符号的字符串版本进行排序来确定的情况下进行操作。快速测试表明这是错误的:

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

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

【问题讨论】:

  • 插入顺序,就像其他属性一样,除了可以扩展的键,它们是按数字排序的,但那些不是符号,所以只是插入。
  • @dandavis 这是一个自我回答,请在下面查看我的答案!如果我遗漏了什么,请告诉我
  • 你为什么要这样做?
  • @dandavis 所以他可以分享他学到的东西
  • @dandavis 正如尼克所说,所以我可以分享我学到的东西。这比完整的博客文章更快(并且更有可能帮助人们)。见blog.stackoverflow.com/2011/07/…

标签: javascript ecmascript-6 symbols


【解决方案1】:

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

  1. 所有getOwnPropertySymbols 所做的只是用(O, Symbol) [spec] 调用内部GetOwnPropertyKeys
  2. GetOwnPropertyKeys 遍历 OwnPropertyKeys,如果所述键是符号,则将它们添加到数组中(因为我们在上面用 Symbol 调用它)。 [spec]。
  3. 返回我们之前创建的数组。

现在至少我们知道幕后发生了什么,但这如何决定顺序?关键是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 所关心的只是它们被添加到对象中的顺序。

【讨论】:

    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2023-03-13
    • 2011-03-16
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多