使用 for..of 循环迭代迭代器而不是 iterable 是否合法?

问题描述

迭代可迭代对象的推荐方法是在对象本身上使用 for..of 循环,如下所示:

const a = [ 'one','two','three' ];
for(const item of a)
  console.log(item);

我一直在尝试迭代并发现以下内容也可以产生完全相同的结果:

const a = [ 'one','three' ];
let iter = a[Symbol.iterator]();
for(const item of iter)
  console.log(item);

即使这样也有效:

const a = [ 'one','three' ];
let iter = a[Symbol.iterator]();
let iter2 = iter[Symbol.iterator]();
for(const item of iter2)
  console.log(item);

关于 for..of 循环,我没有看到迭代迭代器而不是迭代器的建议。例如,参见for..of in MDN

这样迭代合法吗?

解决方法

for..of 假设一个 Iterable(具有 Symbol.iterator 的东西)参见 https://262.ecma-international.org/11.0/#sec-runtime-semantics-forinofheadevaluation,第 7 点。

当你传递一个内置迭代器,比如 StringIteratorArrayIterator 时,没有问题,因为对于内置迭代器(它继承自 IteratorPrototypeSymbol.iterator只返回自身(https://262.ecma-international.org/11.0/#sec-%iteratorprototype%-@@iterator)。

用户定义的迭代器不能保证遵守这个规则,但这样设计它们是一个很好的做法。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...