¿Un iterable es lo mismo que un iterador, o son diferentes?
Parece, según las especificaciones , un iterable es un objeto, por ejemplo, obj
tal que se obj[Symbol.iterator]
refiere a una función, de modo que cuando se invoca, devuelve un objeto que tiene un next
mé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, bar
es el iterable, y wah
es 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, gen1
es el generador, y iter1
es 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, ¿ iter1
es tanto iterable como iterador en este caso?
Además, iter1
es 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 iter1
es 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?
iter1
es 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.