在ES6 JavaScript中@@(“at”是什么意思?

在ES6 JavaScript中@@(“at”是什么意思?,javascript,ecmascript-6,Javascript,Ecmascript 6,我注意到在一篇关于ES6新特性的文章中使用了@,但我不知道它到底是什么意思(不管它实际上是语法还是某种文档约定)。而且很难用谷歌搜索。有人能解释一下吗?@描述了所谓的著名符号。(注意,它在JS中实际上不是有效语法。)根据ES6/ES20151: 众所周知的符号是本规范的算法明确引用的内置符号值。它们通常用作属性的键,这些属性的值用作规范算法的扩展点。除非另有规定,否则所有代码领域(8.2)共享已知符号值 代码领域指的是JavaScript环境的不同实例。例如,根文档的代码域与在中运行的JavaS

我注意到在一篇关于ES6新特性的文章中使用了
@
,但我不知道它到底是什么意思(不管它实际上是语法还是某种文档约定)。而且很难用谷歌搜索。有人能解释一下吗?

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

众所周知的符号是本规范的算法明确引用的内置符号值。它们通常用作属性的键,这些属性的值用作规范算法的扩展点。除非另有规定,否则所有代码领域(8.2)共享已知符号值

代码领域指的是JavaScript环境的不同实例。例如,根文档的代码域与在中运行的JavaScript的代码域不同

当试图使用
instanceof
来确定对象是否是数组时(提示:如果它来自另一个帧,它将不起作用),这就是对象来自哪个代码域的一个例子。为了避免这些类型的问题以符号的形式出现,它们是共享的,这样无论对象来自何处,对(例如)
@@toString
的引用都会起作用

其中一些直接通过
符号
构造函数公开,例如,
@@toPrimitive
作为
符号公开。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
通常,符号用于提供对象上不能与随机特性名称冲突的唯一特性,例如:

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:有关不同名称的一些讨论,请参阅。

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

众所周知的符号是本规范的算法明确引用的内置符号值。它们通常用作属性的键,这些属性的值用作规范算法的扩展点。除非另有规定,否则所有代码领域(8.2)共享已知符号值

代码领域指的是JavaScript环境的不同实例。例如,根文档的代码域与在中运行的JavaScript的代码域不同

当试图使用
instanceof
来确定对象是否是数组时(提示:如果它来自另一个帧,它将不起作用),这就是对象来自哪个代码域的一个例子。为了避免这些类型的问题以符号的形式出现,它们是共享的,这样无论对象来自何处,对(例如)
@@toString
的引用都会起作用

其中一些直接通过
符号
构造函数公开,例如,
@@toPrimitive
作为
符号公开。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
通常,符号用于提供对象上不能与随机特性名称冲突的唯一特性,例如:

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:有关不同名称的一些讨论,请参阅。

请注意,这并不能修复跨帧
实例。一个更好的例子是跨帧可写数组。@Bergi:我试图提供一个跨帧问题的一般例子,这不是我真正的意思——也许我会尝试重新编写它。请注意,这并不能修复跨帧
instanceof
。一个更好的例子是跨帧可写数组。@Bergi:我试图提供一个跨帧问题的一般例子,这不是我真正的意思——也许我会尝试改写它。我们能同意众所周知的符号现在更广为人知吗?:)这是一个内部(仅规范)约定,我们能同意众所周知的符号现在更为人所知吗?:)这是一个内部(仅规范)约定