0

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

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

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

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

即使这样也有效:

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

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

以这种方式迭代是否合法?

4

1 回答 1

0

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

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

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

于 2021-03-25T21:55:41.557 回答