@@("at at")在ES6 JavaScript中意味着什么?

cal*_*lum 43 javascript ecmascript-6

我注意到@@ 页中使用了关于新的ES6功能,但我不知道它究竟意味着什么(无论是实际语法还是某种文档约定).谷歌很难.有人可以解释一下吗?

Qan*_*avy 39

@@描述了一个众所周知的符号.(请注意,它实际上并不是JS中的有效语法.)根据ES6/ES2015 1 规范:

众所周知的符号是内置符号值,由本规范的算法明确引用.它们通常用作属性的键,其值用作规范算法的扩展点.除非另有说明,否则所有Code Realms(8.2)都会共享众所周知的符号值.

Code Realms是指JavaScript环境的不同实例.例如,根文档的代码领域将与运行在其中的JavaScript的代码领域不同<iframe>.

关于对象来自哪个代码域的重要性的一个例子是当试图用来instanceof确定对象是否是一个数组时(提示:如果它来自另一个帧,它将不起作用).为了避免这些问题突然出现符号,它们被共享,因此@@toString无论对象来自何处,对(例如)的引用都将起作用.

其中一些直接通过Symbol构造函数暴露,例如,@@toPrimitive暴露为Symbol.toPrimitive.这可以用于覆盖尝试将对象转换为原始值时产生的值,例如:

let a = { [Symbol.toPrimitive]: () => 1 };
console.log(+a); // 1
console.log(a.valueOf()); // (the same object)
console.log(a.toString()); // "[object Object]"
Run Code Online (Sandbox Code Playgroud)

通常,符号用于在对象上提供不能与随机属性名称冲突的唯一属性,例如:

let a = Symbol();
let foo = { [a]??1?};
foo[a]; // 1
Run Code Online (Sandbox Code Playgroud)

除了从某处获取符号之外,无法访问该值(尽管您可以通过调用获取对象的所有符号Object.getOwnPropertySymbols,因此它们不能用于实现私有属性或方法).

1:有关不同名称的一些讨论,请参阅此讨论主题.