问题描述
迭代可迭代对象的推荐方法是在对象本身上使用 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 点。
当你传递一个内置迭代器,比如 StringIterator
或 ArrayIterator
时,没有问题,因为对于内置迭代器(它继承自 IteratorPrototype
)Symbol.iterator
只返回自身(https://262.ecma-international.org/11.0/#sec-%iteratorprototype%-@@iterator)。
用户定义的迭代器不能保证遵守这个规则,但这样设计它们是一个很好的做法。