Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Javascript生成器既是迭代器又是可重用的?_Javascript_Iterator_Generator_Iterable - Fatal编程技术网

为什么Javascript生成器既是迭代器又是可重用的?

为什么Javascript生成器既是迭代器又是可重用的?,javascript,iterator,generator,iterable,Javascript,Iterator,Generator,Iterable,为什么生成器同时是iterable和iterator是有用的/必要的 我认为iterable和iterator是完全不同的,例如,集合是iterable,这意味着我可以在它上面请求一个迭代器,每次我请求迭代器时,我都会得到一个新的迭代器,它允许我单步遍历整个集合一次 生成器看起来最像迭代器,也就是说,一旦你单步遍历了它的元素,一旦你不能用它做更多的事情,它就实现了next()它实现了iterable的get迭代器逻辑,但是这个逻辑只会返回生成器本身: $ node > const genF

为什么生成器同时是iterable和iterator是有用的/必要的

我认为iterable和iterator是完全不同的,例如,集合是iterable,这意味着我可以在它上面请求一个迭代器,每次我请求迭代器时,我都会得到一个新的迭代器,它允许我单步遍历整个集合一次

生成器看起来最像迭代器,也就是说,一旦你单步遍历了它的元素,一旦你不能用它做更多的事情,它就实现了
next()
它实现了iterable的get迭代器逻辑,但是这个逻辑只会返回生成器本身:

$ 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

为什么生成器除了作为迭代器外还必须是iterable?

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

Python使用相同的迭代器协议;所有迭代器都是iterables,其等价的“getiterator”方法被定义为标识函数


这在逻辑上也是有道理的。“Iterable”表示“能够被迭代”(包括迭代器和可以创建迭代器的内容)。迭代器的概念是iterable事物概念的超集,因此它们需要提供iterable接口。

因为您可以在任何可以使用iterable的上下文中使用生成器…!?好的-然后反过来问“如果它是一个iterable,为什么它也必须是一个迭代器?”集合是iterable而不是迭代器,所以我只是问为什么生成器必须两者都是?因为迭代器只能被迭代一次,这是一个关键的区别。好吧-看起来我被教程“生成器对象同时符合iterable协议和迭代器协议”中的以下评论弄糊涂了。这让我认为这一定是不寻常的,值得指出的,而说“生成器对象是迭代器”就足够了(这自动意味着它们也是iterable,这适用于所有迭代器,而不是生成器的某些特殊特性).我来自Java,
Iterable
接口没有扩展
迭代器
接口,两者是不同的。好吧-经过一点实验,Javascript集合的迭代器似乎也是Iterable的,但这只是为了一般的方便,并非所有迭代器都必须也是iterables。即,除了
next()
之外,并非所有迭代器都实现
[Symbol.iterator]()