ES 6:Symbol.iterator 和@@iterator 的区别

ES 6: Difference between Symbol.iterator and @@iterator

我想知道使用 @@iterator 函数与 Symbol.iterator 函数实现迭代器是否有具体区别:

在 MDN 上,Array.prototype.@@iterator 上有一个页面,但在示例本身中,Symbol.iterator 用作函数名称。这只是更新版本,@@iterator 不再有效,还是两者都有效?

没有@@iterator函数。该标记会产生语法错误 - 表示特定符号。

如果您想在代码中使用该符号,例如要访问数组上的迭代器,您必须使用 Symbol.iterator。这是 Symbol class 的 属性 初始化为具有值 @@iterator.

ECMAScript 2015 (ES6) 规范使用 @@iterator 引用 Symbol.iterator。没有@@iterator,无论你在哪里看到它,都读成Symbol.iterator

我认为(更熟悉 ECMAScript 规范的人可能能够支持这一点)使用 @@iterator 的原因是因为您需要使用方括号访问对象的 Symbol 属性([]),但 ES2015 规范(和文档)的大部分部分使用了更熟悉的点概念(例如 object.propertyobject["property"]), and so@@somesymbol` 用于保持一致。

见第38页(标记为第18页):http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf