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:有关不同名称的一些讨论,请参阅此讨论主题.
| 归档时间: |
|
| 查看次数: |
3042 次 |
| 最近记录: |