我尝试使用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"
为什么?
答案 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"