@@("at at")在ES6JavaScript中是什么意思?
What does @@ ("at at") mean in ES6 JavaScript?
我注意到 @@
在关于 ES6 新功能的 few pages 中使用,但我不知道它到底是什么意思(无论是实际上的语法还是某种文档约定) .而且很难google。有人可以解释一下吗?
@@
描述了所谓的众所周知的符号。 (请注意,它实际上不是 JS 中的有效语法。)根据 ES6/ES20151 specification:
Well-known symbols are built-in Symbol values that are explicitly referenced by algorithms of this specification. They are typically used as the keys of properties whose values serve as extension points of a specification algorithm. Unless otherwise specified, well-known symbols values are shared by all Code Realms (8.2).
代码领域指的是 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]"
通常,符号用于为对象提供独特的属性,这些属性不会与随机的 属性 名称冲突,例如:
let a = Symbol();
let foo = { [a]: 1 };
foo[a]; // 1
除了从某处获取符号外,无法访问该值(尽管您可以通过调用 Object.getOwnPropertySymbols
获取一个对象的所有符号,因此它们不能用于实现私有属性或方法) .
1: 有关不同名称的一些讨论,请参阅 this es-discuss topic。
我注意到 @@
在关于 ES6 新功能的 few pages 中使用,但我不知道它到底是什么意思(无论是实际上的语法还是某种文档约定) .而且很难google。有人可以解释一下吗?
@@
描述了所谓的众所周知的符号。 (请注意,它实际上不是 JS 中的有效语法。)根据 ES6/ES20151 specification:
Well-known symbols are built-in Symbol values that are explicitly referenced by algorithms of this specification. They are typically used as the keys of properties whose values serve as extension points of a specification algorithm. Unless otherwise specified, well-known symbols values are shared by all Code Realms (8.2).
代码领域指的是 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]"
通常,符号用于为对象提供独特的属性,这些属性不会与随机的 属性 名称冲突,例如:
let a = Symbol();
let foo = { [a]: 1 };
foo[a]; // 1
除了从某处获取符号外,无法访问该值(尽管您可以通过调用 Object.getOwnPropertySymbols
获取一个对象的所有符号,因此它们不能用于实现私有属性或方法) .
1: 有关不同名称的一些讨论,请参阅 this es-discuss topic。