为什么Javascript生成器既是迭代器又是迭代器?

时间:2018-03-08 10:35:47

标签: javascript iterator generator iterable

为什么生成器既可以是迭代也是迭代器是有用/必要的?

我认为迭代和迭代器非常不同,例如一个集合是一个可迭代的,这意味着我可以在它上面请求一个迭代器,每次我这样做,我得到一个新的迭代器,允许我逐步完成完整的集合 >

生成器看起来最像是一个迭代器,即一旦你不能再用它来执行它的元素,但是实现next()它实现了迭代的get-iterator逻辑但只有这样才能使这个逻辑返回发生器本身:

$ node
> const genFn = function* () { yield *[1, 2, 3]; }
> const gen = genFn();
> gen.next();
{ value: 1, done: false }
> gen == gen[Symbol.iterator]();
true
> for (const val of gen) console.log(val);
2
3

除了作为迭代器之外,为什么生成器必须是可迭代的?

1 个答案:

答案 0 :(得分:2)

因为它允许翻译机构无条件地请求新的"迭代器只要它需要一个,而不用担心迭代是否已经已经一个迭代器。编写用于实现for/of循环的代码非常容易,该循环无条件地调用.iterator作为安装过程的一部分接收的所有内容,而不是让每次迭代启动都执行类型检查以查看如果收到的内容已经是迭代器,并且只是有条件地调用.iterator

Python使用相同的迭代器协议;所有迭代器都是迭代的,它们的等价物是#34; getiterator"方法被定义为身份函数。

逻辑上也是有道理的。 "可迭代"意味着能够被迭代" (它涵盖了迭代器和可以创建迭代器的东西)。迭代器的概念是可迭代事物概念的超集,因此它们需要提供可迭代的接口。