Ist ein Iterable dasselbe wie ein Iterator oder unterscheiden sie sich?
Es scheint, von den Vorgaben , ein iterable ein Objekt ist, sagen wir, ist obj
, so dass obj[Symbol.iterator]
auf eine Funktion verweist, so dass , wenn aufgerufen, gibt ein Objekt , das eine hat next
Methode , die eine Rückkehr kann {value: ___, done: ___}
Objekt:
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)
Im obigen Code bar
ist also die Iterierbarkeit und wah
der Iterator und next()
die Iteratorschnittstelle.
Iterable und Iterator sind also verschiedene Dinge.
Nun jedoch zu einem gängigen Beispiel für Generator und Iterator:
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
Im obigen Fall gen1
ist der Generator und iter1
der Iterator und iter1.next()
erledigt die richtige Arbeit. Gibt iter1[Symbol.iterator]
aber eine Funktion, die beim Aufrufen etwas zurückgibt iter1
, was ein Iterator ist. So iter1
ist sowohl ein iterable und Iterator in diesem Fall?
Außerdem iter1
unterscheidet es sich von dem obigen Beispiel 1, weil das Iterable in Beispiel 1 [1, 3, 5]
so oft geben kann, wie es gewünscht wird [...bar]
, während iter1
es ein Iterable ist, aber da es sich selbst zurückgibt, das jedes Mal der gleiche Iterator ist, gibt es nur [1, 3, 5]
einmal.
Wir können also für eine Iterable sagen, bar
wie oft [...bar]
das Ergebnis erzielt werden kann [1, 3, 5]
- und die Antwort ist, es hängt davon ab. Und ist iterierbar dasselbe wie ein Iterator? Und die Antwort ist, sie sind verschiedene Dinge, aber sie können gleich sein, wenn sich das Iterable selbst als Iterator verwendet. Ist das korrekt?
iter1
ist in diesem Fall sowohl ein Iterator als auch ein Iterator? " - ja. Alle nativen Iteratoren können auch iteriert werden, indem sie sich selbst zurückgeben, sodass Sie sie problemlos an Konstrukte übergeben können, die eine Iterierbarkeit erwarten.