Maybaygiare.org

Blog Network

Iteratoren und Generatoren

In JavaScript ist ein Iterator ein Objekt, das eine Sequenz und möglicherweise einen Rückgabewert bei ihrer Beendigung definiert.

Insbesondere ist ein Iterator jedes Objekt, das das Iteratorprotokoll implementiert, indem es eine next() Methode hat, die ein Objekt mit zwei Eigenschaften zurückgibt:

value Der nächste Wert in der Iterationssequenz. done Dies ist true wenn der letzte Wert in der Sequenz bereits verbraucht wurde. Wenn value neben done vorhanden ist, ist dies der Rückgabewert des Iterators.

Einmal erstellt, kann ein Iteratorobjekt explizit iteriert werden, indem next() wiederholt aufgerufen wird. Das Iterieren über einen Iterator soll den Iterator verbrauchen, da dies im Allgemeinen nur einmal möglich ist. Nachdem ein Beendigungswert erhalten wurde, sollten zusätzliche Aufrufe von next() weiterhin {done: true} .

Der häufigste Iterator in JavaScript ist der Array-Iterator, der jeden Wert im zugehörigen Array nacheinander zurückgibt.

Es ist zwar leicht vorstellbar, dass alle Iteratoren als Arrays ausgedrückt werden können, dies ist jedoch nicht der Fall. Arrays müssen vollständig zugewiesen werden, Iteratoren werden jedoch nur bei Bedarf verwendet. Aus diesem Grund können Iteratoren Sequenzen unbegrenzter Größe ausdrücken, z. B. den Bereich von Ganzzahlen zwischen 0 und Infinity .

Hier ist ein Beispiel, das genau das tun kann. Es ermöglicht die Erstellung eines einfachen Bereichsiterators, der eine Folge von Ganzzahlen von start (inklusive) bis end (exklusiv) im Abstand von step auseinander definiert. Der endgültige Rückgabewert ist die Größe der erstellten Sequenz, die von der Variablen iterationCount .

function makeRangeIterator(start = 0, end = Infinity, step = 1) { let nextIndex = start; let iterationCount = 0; const rangeIterator = { next: function() { let result; if (nextIndex < end) { result = { value: nextIndex, done: false } nextIndex += step; iterationCount++; return result; } return { value: iterationCount, done: true } } }; return rangeIterator;}

Die Verwendung des Iterators sieht dann folgendermaßen aus:

const it = makeRangeIterator(1, 10, 2);let result = it.next();while (!result.done) { console.log(result.value); // 1 3 5 7 9 result = it.next();}console.log("Iterated over sequence of size: ", result.value); // 

Hinweis: Es ist nicht möglich, reflektiv zu wissen, ob ein bestimmtes Objekt ein Iterator ist. Wenn Sie dies tun müssen, verwenden Sie Iterables .

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.