Symbol()和Symbol.for()之间的区别

时间:2016-01-04 09:21:29

标签: ecmascript-6

我尝试使用Symbol密钥创建对象,并使用Symbol.for找到相应的值,但它不起作用:

const sym = Symbol("x");

let obj = {
  [sym]: "val"
}

console.log(obj[sym]); // "val"
console.log(obj[Symbol.for("x")]); // undefined, but expected "val"

为什么?

2 个答案:

答案 0 :(得分:6)

使用Symbol()创建的符号是唯一且不可变的,因此您可以引用它的唯一方法是将其分配给变量。

重要的是要注意构造函数参数实际上是符号的描述不是键。来自MDN:

  

可用于调试但不能用于调试的符号的说明   访问符号本身

(强调我的)

另一方面,

Symbol.for使用指定的将Symbols存储在全局注册表列表中,因此为了您的示例,您需要同时创建使用Symbol.for访问该符号:

const sym = Symbol.for("x"); // Create a symbol in the global registry

let obj = {
  [sym]: "val"
}

console.log(obj[Symbol.for("x")]); // Access the symbol from the global registry

答案 1 :(得分:3)

这不是Symbol.for的工作方式。

如果您使用Symbol功能创建新的Symbol,则每次都会获得一个唯一的符号。例如:

const sym1 = Symbol("x");
const sym2 = Symbol("x");
sym1 === sym2; // returns false

如果您想使用全局符号,您还必须使用Symbol.for来定义它:

const sym = Symbol.for("x");

let obj = {
  [sym]: "val"
}

console.log(obj[Symbol.for("x")]); // undefined, but expected "val"