Iterator
Baseline
Weitgehend verfügbar
*
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit September 2016 browserübergreifend verfügbar.
* Einige Teile dieser Funktion werden möglicherweise unterschiedlich gut unterstützt.
Ein Iterator-Objekt ist ein Objekt, das dem Iterator-Protokoll entspricht: Es stellt eine next()-Methode bereit, die ein Iterator-Ergebnisobjekt zurückgibt. Alle integrierten Iteratoren erben von der Klasse Iterator. Die Klasse Iterator stellt eine [Symbol.iterator]()-Methode bereit, die das Iterator-Objekt selbst zurückgibt. Dadurch ist der Iterator auch iterierbar. Außerdem stellt sie Hilfsmethoden für die Arbeit mit Iteratoren bereit.
Beschreibung
Die folgenden Iteratoren sind alle in JavaScript integriert:
- Der Array Iterator, der von
Array.prototype.values(),Array.prototype.keys(),Array.prototype.entries(),Array.prototype[Symbol.iterator](),TypedArray.prototype.values(),TypedArray.prototype.keys(),TypedArray.prototype.entries(),TypedArray.prototype[Symbol.iterator]()undarguments[Symbol.iterator]()zurückgegeben wird. - Der String Iterator, der von
String.prototype[Symbol.iterator]()zurückgegeben wird. - Der Map Iterator, der von
Map.prototype.values(),Map.prototype.keys(),Map.prototype.entries()undMap.prototype[Symbol.iterator]()zurückgegeben wird. - Der Set Iterator, der von
Set.prototype.values(),Set.prototype.keys(),Set.prototype.entries()undSet.prototype[Symbol.iterator]()zurückgegeben wird. - Der RegExp String Iterator, der von
RegExp.prototype[Symbol.matchAll]()undString.prototype.matchAll()zurückgegeben wird. - Das
Generator-Objekt, das von Generatorfunktionen zurückgegeben wird. - Der Segments Iterator, der von der
[Symbol.iterator]()-Methode desSegments-Objekts zurückgegeben wird, dasIntl.Segmenter.prototype.segment()liefert. - Der Iterator Helper, der von Iterator-Hilfsmethoden wie
Iterator.prototype.filter()undIterator.prototype.map()zurückgegeben wird.
Auch Web-APIs können Iteratoren zurückgeben. Einige verwenden JavaScript-Iteratoren wieder, während andere eigene Iteratoren definieren. Zum Beispiel:
- Array-ähnliche Objekte wie
NodeListgeben über ihre jeweiligen Methodenkeys(),values(),entries()und[Symbol.iterator]()einen Array Iterator zurück. - Map-ähnliche Objekte aus Web-APIs wie
Headersgeben über ihre jeweiligen Methodenkeys(),values(),entries()und[Symbol.iterator]()einen eigenen Iteratortyp wie Headers Iterator zurück. - Set-ähnliche Objekte aus Web-APIs wie
FontFaceSetgeben über ihre jeweiligen Methodenkeys(),values(),entries()und[Symbol.iterator]()einen eigenen Iteratortyp wie FontFaceSet Iterator zurück.
Hinweis:
NodeIterator und andere ältere Schnittstellen tragen zwar entsprechende Namen, entsprechen aber weder dem Iterator-Protokoll noch dem Iterable-Protokoll.
Jeder dieser Iteratoren hat ein eigenes Prototypobjekt, das die next()-Methode für den jeweiligen Iterator definiert. Beispielsweise erben alle String-Iteratorobjekte von einem verborgenen Objekt StringIteratorPrototype, dessen next()-Methode den String nach Codepunkten durchläuft. StringIteratorPrototype hat außerdem eine [Symbol.toStringTag]-Eigenschaft, deren Anfangswert der String "String Iterator" ist. Diese Eigenschaft wird von Object.prototype.toString() verwendet. Auch die anderen Iterator-Prototypen haben jeweils eigene [Symbol.toStringTag]-Werte, die den oben genannten Namen entsprechen.
Alle diese Prototypobjekte erben von Iterator.prototype. Dieses stellt eine [Symbol.iterator]()-Methode bereit, die das Iterator-Objekt selbst zurückgibt. Dadurch ist der Iterator auch iterierbar.
Iterator-Hilfsmethoden
Hinweis:
Diese Methoden sind Hilfsmethoden für Iteratoren, nicht für Iterables. Damit ein Objekt iterierbar ist, muss es lediglich eine [Symbol.iterator]()-Methode besitzen. Es gibt keinen gemeinsamen Prototyp, auf dem diese Methoden bereitgestellt werden könnten.
Die Klasse Iterator selbst stellt einige Hilfsmethoden für die Arbeit mit Iteratoren bereit. Beispielsweise könnten Sie versucht sein, Folgendes zu tun:
const nameToDeposit = new Map([
["Anne", 1000],
["Bert", 1500],
["Carl", 2000],
]);
const totalDeposit = [...nameToDeposit.values()].reduce((a, b) => a + b);
Dabei wird der von Map.prototype.values() zurückgegebene Iterator zunächst in ein Array umgewandelt. Anschließend wird mit Array.prototype.reduce() die Summe berechnet. Dies erzeugt jedoch ein Zwischenarray und durchläuft das Array zweimal. Stattdessen können Sie die reduce()-Methode des Iterators selbst verwenden:
const totalDeposit = nameToDeposit.values().reduce((a, b) => a + b);
Diese Methode kann effizienter sein, insbesondere hinsichtlich des Speicherverbrauchs: Sie durchläuft den Iterator nur einmal und speichert keine Zwischenwerte. Für die Arbeit mit unendlichen Iteratoren sind Iterator-Hilfsmethoden notwendig:
function* fibonacci() {
let current = 1;
let next = 1;
while (true) {
yield current;
[current, next] = [next, current + next];
}
}
const seq = fibonacci();
const firstThreeDigitTerm = seq.find((n) => n >= 100);
Sie können seq nicht in ein Array umwandeln, da es unendlich ist. Stattdessen können Sie die find()-Methode des Iterators selbst verwenden. Sie durchläuft seq nur so weit, wie es nötig ist, um den ersten Wert zu finden, der die Bedingung erfüllt.
Viele Iterator-Methoden entsprechen sinngemäß Array-Methoden, zum Beispiel:
Iterator.prototype.drop() und Iterator.prototype.take() entsprechen in Kombination ungefähr Array.prototype.slice().
Iterator-Hilfsobjekte
Hinweis: Iterator-Hilfsobjekte und Iterator-Hilfsmethoden sind zwei unterschiedliche Konzepte. Ein Iterator-Hilfsobjekt lässt sich zur Laufzeit erkennen, während „Iterator-Hilfsmethode“ lediglich eine Bezeichnung für eine Gruppe von Methoden ist. Je nach Kontext kann sich Iterator Helper auf das Objekt oder die Methode beziehen.
Von den Iterator-Hilfsmethoden geben filter(), flatMap(), map(), drop() und take() ein neues Iterator Helper-Objekt zurück. Dieses Hilfsobjekt ist ebenfalls eine Iterator-Instanz, sodass sich die Hilfsmethoden verketten lassen. Alle Iterator-Hilfsobjekte erben von einem gemeinsamen Prototypobjekt, das das Iterator-Protokoll implementiert:
next()-
Ruft die
next()-Methode des zugrunde liegenden Iterators auf, wendet die Hilfsmethode auf das Ergebnis an und gibt das Ergebnis zurück. return()-
Ruft die
return()-Methode des zugrunde liegenden Iterators auf und gibt das Ergebnis zurück.
Das Iterator-Hilfsobjekt verwendet dieselbe Datenquelle wie der zugrunde liegende Iterator. Wenn das Hilfsobjekt durchlaufen wird, wird daher auch der zugrunde liegende Iterator durchlaufen. Es gibt keine Möglichkeit, einen Iterator zu „verzweigen“, um ihn mehrfach durchlaufen zu können.
const it = [1, 2, 3].values();
const it2 = it.drop(0); // Essentially a copy
console.log(it.next().value); // 1
console.log(it2.next().value); // 2
console.log(it.next().value); // 3
Vollständige Iteratoren
Es gibt zwei Arten von „Iteratoren“: Objekte, die dem Iterator-Protokoll entsprechen (wofür mindestens eine next()-Methode vorhanden sein muss), und Objekte, die von der Klasse Iterator erben und dadurch Zugriff auf die Hilfsmethoden haben. Keine der beiden Eigenschaften setzt die andere voraus: Objekte, die von Iterator erben, werden nicht automatisch zu Iteratoren, da die Klasse Iterator keine next()-Methode definiert. Das Objekt muss selbst eine next()-Methode definieren. Ein vollständiger Iterator entspricht sowohl dem Iterator-Protokoll als auch der Vererbung von Iterator. Die meisten Programme erwarten vollständige Iteratoren und dass iterierbare Objekte vollständige Iteratoren zurückgeben. Um vollständige Iteratoren zu erstellen, definieren Sie eine Klasse, die Iterator erweitert, oder verwenden Sie die Methode Iterator.from().
class MyIterator extends Iterator {
next() {
// …
}
}
const myIterator = Iterator.from({
next() {
// …
},
});
Konstruktor
Iterator()-
Ist dafür vorgesehen, von anderen Klassen erweitert zu werden, die Iteratoren erzeugen. Wird beim direkten Aufruf des Konstruktors ein Fehler ausgelöst.
Statische Methoden
Iterator.concat()-
Erstellt aus einer Liste iterierbarer Objekte ein neues
Iterator-Objekt. Der neue Iterator liefert nacheinander die Werte der einzelnen übergebenen iterierbaren Objekte. Iterator.from()-
Erstellt aus einem Iterator oder einem iterierbaren Objekt ein neues
Iterator-Objekt. Iterator.zip()-
Erstellt ein neues
Iterator-Objekt, das Elemente aus mehreren iterierbaren Objekten zusammenfasst. Es liefert Arrays mit den Elementen an jeweils derselben Position. Iterator.zipKeyed()-
Erstellt ein neues
Iterator-Objekt, das Elemente aus mehreren iterierbaren Objekten zusammenfasst. Es liefert Objekte mit den Elementen an jeweils derselben Position und mit Schlüsseln, die durch die Eingabe festgelegt werden.
Instanzeigenschaften
Diese Eigenschaften sind auf Iterator.prototype definiert und werden von allen Iterator-Instanzen gemeinsam genutzt.
Iterator.prototype.constructor-
Die Konstruktorfunktion, die das Instanzobjekt erstellt hat. Für
Iterator-Instanzen ist der Anfangswert derIterator-Konstruktor. Iterator.prototype[Symbol.toStringTag]-
Der Anfangswert der Eigenschaft
[Symbol.toStringTag]ist der String"Iterator". Diese Eigenschaft wird vonObject.prototype.toString()verwendet.Hinweis: Anders als
[Symbol.toStringTag]bei den meisten integrierten Klassen istIterator.prototype[Symbol.toStringTag]aus Gründen der Web-Kompatibilität beschreibbar.
Instanzmethoden
Iterator.prototype.chunks()-
Gibt ein neues Iterator-Hilfsobjekt zurück, das die Elemente des ursprünglichen Iterators in aufeinanderfolgende Array-Abschnitte aufteilt. Bei jedem Iterationsschritt entnimmt das Hilfsobjekt dem zugrunde liegenden Iterator die angegebene Anzahl an Elementen und liefert sie gemeinsam.
Iterator.prototype.drop()-
Gibt ein neues Iterator-Hilfsobjekt zurück, das die angegebene Anzahl an Elementen am Anfang dieses Iterators überspringt.
Iterator.prototype.every()-
Gibt
falsezurück, wenn ein Element gefunden wird, das die angegebene Prüffunktion nicht erfüllt. Andernfalls wirdtruezurückgegeben, wenn der Iterator durchlaufen wurde, ohne ein solches Element zu finden. Iterator.prototype.filter()-
Gibt ein neues Iterator-Hilfsobjekt zurück, das nur die Elemente des Iterators liefert, für die die angegebene Callback-Funktion
truezurückgibt. Iterator.prototype.find()-
Gibt das erste vom Iterator gelieferte Element zurück, das die angegebene Prüffunktion erfüllt. Wenn kein Wert die Prüffunktion erfüllt, wird
undefinedzurückgegeben. Iterator.prototype.flatMap()-
Gibt ein neues Iterator-Hilfsobjekt zurück, das jedes Element des ursprünglichen Iterators an eine Abbildungsfunktion übergibt und die von ihr zurückgegebenen Elemente liefert. Diese Elemente sind in einem anderen Iterator oder iterierbaren Objekt enthalten.
Iterator.prototype.forEach()-
Führt eine angegebene Funktion einmal für jedes vom Iterator gelieferte Element aus.
Iterator.prototype.includes()-
Gibt
truezurück, wenn ein vom Iterator geliefertes Element dem angegebenen Wert entspricht. Andernfalls wirdfalsezurückgegeben, wenn der Iterator durchlaufen wurde, ohne ein solches Element zu finden. Iterator.prototype.join()-
Gibt einen String zurück, der aus der Verkettung aller vom Iterator gelieferten Elemente besteht, getrennt durch Kommas oder einen angegebenen Trennstring.
Iterator.prototype.map()-
Gibt ein neues Iterator-Hilfsobjekt zurück, das die Elemente des Iterators liefert, nachdem jedes durch eine Abbildungsfunktion transformiert wurde.
Iterator.prototype.reduce()-
Führt für jedes vom Iterator gelieferte Element eine vom Benutzer bereitgestellte „Reducer“-Callback-Funktion aus und übergibt dabei das Ergebnis der Berechnung für das vorherige Element. Das Endergebnis der Anwendung auf alle Elemente ist ein einzelner Wert.
Iterator.prototype.some()-
Gibt
truezurück, wenn ein Element gefunden wird, das die angegebene Prüffunktion erfüllt. Andernfalls wirdfalsezurückgegeben, wenn der Iterator durchlaufen wurde, ohne ein solches Element zu finden. Iterator.prototype.take()-
Gibt ein neues Iterator-Hilfsobjekt zurück, das die angegebene Anzahl an Elementen dieses Iterators liefert und danach endet.
Iterator.prototype.toArray()-
Erstellt eine neue
Array-Instanz, die mit den vom Iterator gelieferten Elementen gefüllt ist. Iterator.prototype.windows()-
Gibt ein neues Iterator-Hilfsobjekt zurück, das ein gleitendes Fenster von Elementen liefert. Bei jedem Iterationsschritt liefert es ein Array, bei dem gegenüber dem vorherigen Schritt das erste Element entfernt und das nächste Element aus dem ursprünglichen Iterator hinzugefügt wurde.
Iterator.prototype[Symbol.dispose]()-
Ruft die
return()-Methode vonthisauf, sofern sie vorhanden ist. Dies implementiert das Disposable-Protokoll und ermöglicht die Freigabe bei der Verwendung mitusingoderawait using. Iterator.prototype[Symbol.iterator]()-
Gibt das Iterator-Objekt selbst zurück. Dadurch sind Iterator-Objekte auch iterierbar.
Beispiele
>Einen Iterator als iterierbares Objekt verwenden
Alle integrierten Iteratoren sind auch iterierbar. Sie können sie daher in einer for...of-Schleife verwenden:
const arrIterator = [1, 2, 3].values();
for (const value of arrIterator) {
console.log(value);
}
// Logs: 1, 2, 3
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-iterator-objects> |