Symbol.keyFor()如何工作?

时间:2018-05-12 08:52:39

标签: ecmascript-6

对于以下代码,

let obj = {
    [Symbol('my_key')]: 1,
    enum: 2,
    nonEnum: 3
}

document.write(Symbol.keyFor(Symbol.for('my_key')) + '<br>'); //  retrieves 'my_key'
document.write(Symbol.keyFor(Object.getOwnPropertySymbols(obj)[0])); //  does not retrieve 'my_key'

以下是输出:

my_key
undefined

为什么Symbol.keyFor()在第二种情况下无法检索令牌字符串?

1 个答案:

答案 0 :(得分:1)

来自MDN

  

Symbol.keyFor(sym)方法从给定符号的全局符号注册表中检索共享符号键。

在第一种情况下,您使用全局符号,但使用本地符号作为对象键:

// local symbol
Symbol('my_key')

// global symbol
Symbol.for('my_key')

当你在对象文字中使用全局符号时,它会像你期望的那样工作:

let obj = {
    [Symbol.for('my_key')]: 1,
    enum: 2,
    nonEnum: 3
}

全局符号存储在全局符号注册表中。如何存储本地符号取决于您。这里说明了两者之间的区别:

Symbol('my_key') === Symbol('my_key') // false
Symbol.for('my_key') === Symbol.for('my_key') // true