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

nil*_*ils 11 javascript ecmascript-6

我想知道使用@@iterator函数与Symbol.iterator一个函数实现迭代器是否存在特定的差异:

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

Ber*_*rgi 7

没有@@iterator功能.该令牌产生语法错误 - 它仅在规范中用于表示特定符号.

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


Tho*_*ter 7

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