¿Un iterable es lo mismo que un iterador, o son diferentes?
Parece, según las especificaciones , un iterable es un objeto, por ejemplo, objtal que se obj[Symbol.iterator]refiere a una función, de modo que cuando se invoca, devuelve un objeto que tiene un nextmétodo que puede devolver un {value: ___, done: ___}objeto:
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)
Entonces, en el código anterior, bares el iterable, y wahes el iterador, y next()es la interfaz del iterador.
Entonces, iterable e iterator son cosas diferentes.
Ahora, sin embargo, en un ejemplo común de generador e iterador:
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
En el caso anterior, gen1es el generador, y iter1es el iterador, y iter1.next()hará el trabajo adecuado. Pero iter1[Symbol.iterator]da una función que, cuando se invoca, devuelve iter1, que es un iterador. Entonces, ¿ iter1es tanto iterable como iterador en este caso?
Además, iter1es diferente del ejemplo 1 anterior, porque el iterable en el ejemplo 1 puede dar [1, 3, 5]tantas veces como quiera usando [...bar], mientras que iter1es iterable, pero dado que regresa a sí mismo, que es el mismo iterador cada vez, solo dará [1, 3, 5]una vez.
Entonces, podemos decir, para un iterable bar, cuántas veces puede [...bar]dar el resultado [1, 3, 5], y la respuesta es que depende. ¿Y es iterable lo mismo que un iterador? Y la respuesta es que son cosas diferentes, pero pueden ser lo mismo, cuando el iterable se utiliza como iterador. ¿Es eso correcto?
iter1es tanto iterable como iterador en este caso? ", Sí. Todos los iteradores nativos también son iterables devolviéndose ellos mismos, para que pueda pasarlos fácilmente a construcciones que esperan un iterable.