【发布时间】:2018-08-16 16:21:38
【问题描述】:
为什么生成器既是可迭代的又是迭代器的有用/必要?
我认为 iterable 和 iterator 是完全不同的,例如一个集合是一个可迭代的,这意味着我可以在它上面请求一个迭代器,每次我这样做我都会得到一个新的迭代器,它允许我单步执行 complete 集合一次.
一个生成器看起来最像一个迭代器,即一旦你单步执行它的元素,一旦你不能用它做更多的事情,但除了实现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
为什么生成器除了是迭代器之外还必须是可迭代的?
【问题讨论】:
-
因为您可以在任何可以使用可迭代对象的上下文中使用生成器...!?
-
OK - 那么翻转是问“如果它是一个可迭代的,为什么它也必须是一个迭代器?”集合是可迭代的,而不是迭代器,所以我只是在问为什么生成器需要两者兼而有之?
-
因为一个迭代器具体只能迭代一次,这是一个关键的区别。
标签: javascript iterator generator iterable