javascript - 为什么 Javascript 生成器既是迭代器又是可迭代对象?

标签 javascript iterator generator iterable

为什么生成器既是可迭代对象又是迭代器是有用/必要的?

我认为 iterable 和 iterator 是截然不同的,例如一个集合是一个可迭代的,这意味着我可以在它上面请求一个迭代器,每次我这样做我都会得到一个新的迭代器,它允许我完成集合一次.

生成器看起来最像一个迭代器,即一旦你单步执行它的元素,一旦你不能用它做更多的事情,但是除了实现 next() 它还实现了 get -iterable 的迭代器逻辑,但仅限于此逻辑返回生成器本身:

$ 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

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

最佳答案

因为它允许解释器机制在需要时无条件地请求一个"new"迭代器,而不用担心可迭代对象是否已经是一个迭代器。编写用于实现 for/of 循环的代码非常容易,该循环无条件地调用 .iterator 作为设置过程的一部分接收到的所有内容,而不是每次启动迭代执行类型检查以查看它接收到的是否已经是迭代器,并且仅有条件地调用 .iterator

Python 使用相同的迭代器协议(protocol);所有迭代器都是可迭代对象,其中等效的“getiterator”方法被定义为恒等函数。

这在逻辑上也是有道理的。 “可迭代”的意思是“能够被迭代”(它包括迭代器和可以创建迭代器的东西)。迭代器的概念是可迭代事物概念的超集,因此需要提供可迭代的接口(interface)。

关于javascript - 为什么 Javascript 生成器既是迭代器又是可迭代对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49170998/

相关文章:

javascript - jsPlumb.on()函数规范

Javascript onclick、onmouseout 冲突、循环

C++ 通用 int 数组和 vector 迭代器

c++ - 为什么(必须)从 std::iterator 继承?

java - Hibernate 5.1 中的 EnversSchemaGenerator 在哪里?

javascript - Laravel 5.3 和 Ajax 分页

javascript - Webpack:index.html 上未定义导出默认类

java - java 堆迭代器

c++ - 遍历所有可能的位排列

python - 生成器因 NoneType 错误而失败