2015-04-07 37 views

回答

25

@@描述了所谓的着名符号。 (请注意,它实际上不是有效的语法在JS。)根据ES6/ES2015 specification

著名符号内置明确可以本规范的算法引用符号值。它们通常用作其值作为规范算法的扩展点的属性的键。除非另有说明,否则所有代码领域(8.2)共享众所周知的符号值。

代码区域引用JavaScript环境的不同实例。例如,根文档的代码领域将与在中运行的JavaScript代码领域不同。

当一个对象来自什么样的代码领域时,它试图使用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]" 

一般来说,符号被用于提供在物体上的独特性质,这不能以随机属性碰撞名称,例如:

let a = Symbol(); 
let foo = { [a]: 1 }; 
foo[a]; // 1 

有没有办法进入除非获得从某处符号价值(尽管你可以通过调用Object.getOwnPropertySymbols获取对象的所有符号,所以它们不能被用来实现私有属性或方法)。

1:请参阅this es-discuss topic了解有关不同名称的一些讨论。

+0

注意,这不能修复跨帧'instanceof'。一个更好的例子是跨帧可迭代数组。 – Bergi

+0

@Bergi:我一直试图提供一个跨框架问题的例子,这并不是我的意思 - 也许我会试着重新说一遍。 –

相关问题