可迭代与迭代器相同还是不同?
从规范中看来,一个可迭代对象是一个对象,例如,obj
它obj[Symbol.iterator]
引用一个函数,以便在被调用时返回一个对象,该对象具有next
可以返回该{value: ___, done: ___}
对象的方法:
function foo() {
let i = 0;
const wah = {
next: function() {
if (i <= 2) return { value: (1 + 2 * i++), done: false }
else return { value: undefined, done: true }
}
};
return wah; // wah is iterator
}
let bar = {} // bar is iterable
bar[Symbol.iterator] = foo;
console.log([...bar]); // [1, 3, 5]
for (a of bar) console.log(a); // 1 3 5 (in three lines)
因此,在上面的代码中,bar
是,wah
是迭代器,next()
是迭代器接口。
因此,可迭代和迭代器是不同的东西。
但是,现在,在生成器和迭代器的常见示例中:
function* gen1() {
yield 1;
yield 3;
yield 5;
}
const iter1 = gen1();
console.log([...iter1]); // [1, 3, 5]
for (a of iter1) console.log(a); // nothing
const iter2 = gen1();
for (a of iter2) console.log(a); // 1 3 5 (in three lines)
console.log(iter1[Symbol.iterator]() === iter1); // true
在上述情况下,gen1
是生成器,iter1
是迭代器,iter1.next()
将完成适当的工作。但是iter1[Symbol.iterator]
确实提供了一个函数,该函数在调用时会返回iter1
,这是一个迭代器。那么iter1
在这种情况下既是可迭代的又是迭代器?
此外,iter1
从上面的例子1不同,因为迭代实例1中可以给[1, 3, 5]
作为用想很多次[...bar]
,虽然iter1
是一个迭代的,但由于它返回本身,这是每次迭代器一样,只会给[1, 3, 5]
一次。
所以我们可以说,对于一个可迭代的结果,bar
可以[...bar]
给出多少次结果[1, 3, 5]
-答案是,这取决于。并且可迭代与迭代器相同吗?答案是,它们是不同的东西,但是当可迭代对象将自身用作迭代器时,它们可以是相同的。那是对的吗?
iter1
,在这种情况下,迭代和迭代都是吗? ”-是的。所有本机迭代器也可以通过返回自身来进行迭代,因此您可以轻松地将它们传递给需要迭代的构造。