以下内容适用于我检查过的JavaScript运行时(Node.js和Firefox(:
let xs = [0, 1, 2]
let it = xs[Symbol.iterator]()
for (let x of it) console.log(x)
这是有效的,因为it
迭代器本身是可迭代的,即它具有Symbol.iterator
属性。人们可以认为这是因为Array.prototype[Symbol.iterator]
是作为生成器实现的。
我的问题是,我可以依靠it
可迭代吗?也就是说,规范是否需要它?
我看过(我认为这是相关的部分(,我找不到任何说数组迭代器应该是可迭代的,或者它必须用生成器实现的东西。
你可以!核心对象的所有标准迭代器都扩展了%IteratorPrototype%
,其中专门定义了:
25.1.2.1 %迭代器原型% [ @@iterator ] ( (
因此,采取以下步骤:
- 返回
this
值。此函数的
name
属性的值为[Symbol.iterator]
。
每个内置迭代器在用作可迭代对象时都会自动返回自身,因此在for...of
或任何其他迭代上下文中使用它都是安全的。