【问题标题】:ES 6: Difference between Symbol.iterator and @@iteratorES 6:Symbol.iterator 和 @@iterator 之间的区别
【发布时间】:2015-06-22 14:24:00
【问题描述】:
我想知道使用@@iterator 函数与Symbol.iterator 函数实现迭代器是否有特定区别:
在 MDN 上,Array.prototype.@@iterator 上有一个页面,但在示例本身中,Symbol.iterator 被用作函数名。这只是更新版本,@@iterator 不再有效,还是两者都有效?
【问题讨论】:
标签:
javascript
ecmascript-6
【解决方案1】:
ECMAScript 2015 (ES6) 规范使用@@iterator 来引用Symbol.iterator。没有@@iterator,无论你在哪里看到它,都读作Symbol.iterator。
我认为(更熟悉 ECMAScript 规范的人可能会支持这一点)使用 @@iterator 的原因是因为您需要使用方括号 ([]) 访问对象上的 Symbol 属性,但大多数ES2015 规范(和文档)的部分内容使用了更熟悉的点概念(例如,object.property 与 object["property"]), and so@@somesymbol` 用于保持一致。
参见第 38 页(标记为第 18 页):http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
【解决方案2】:
没有@@iterator 函数。该标记会产生语法错误 - only used in specification 表示特定符号。
如果您想在代码中使用该符号,例如要访问数组上的迭代器,您必须使用Symbol.iterator。这是Symbol 类的属性,初始化为具有值@@iterator。