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, indem es eine next()-Methode bereitstellt, die ein Iterator-Ergebnisobjekt zurückgibt. Alle eingebauten Iteratoren erben von der Iterator-Klasse. Die Iterator-Klasse stellt eine [Symbol.iterator]()-Methode bereit, die das Iterator-Objekt selbst zurückgibt, wodurch der Iterator auch iterierbar wird. Sie bietet auch einige Hilfsmethoden für die Arbeit mit Iteratoren.
Beschreibung
Dies sind alle eingebauten JavaScript-Iteratoren:
- 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 Generator-Funktionen zurückgegeben wird. - Der Segments-Iterator, der von der
[Symbol.iterator]()-Methode desSegments-Objekts, das vonIntl.Segmenter.prototype.segment()zurückgegeben wird. - Der Iterator Helper, der von Iterator-Hilfsmethoden wie
Iterator.prototype.filter()undIterator.prototype.map()zurückgegeben wird.
Web-APIs können ebenfalls Iteratoren zurückgeben. Einige verwenden Kern-JavaScript-Iteratoren wieder, während andere ihre eigenen Iteratoren definieren. Zum Beispiel:
- Array-ähnliche Objekte wie
NodeListgeben einen Array-Iterator aus ihren jeweiligen Methodenkeys(),values(),entries()und[Symbol.iterator]()zurück. - Map-ähnliche Objekte von Web-APIs wie
Headersgeben ihren eigenen Iteratortyp wie Headers-Iterator aus ihren jeweiligen Methodenkeys(),values(),entries()und[Symbol.iterator]()zurück. - Set-ähnliche Objekte von Web-APIs wie
FontFaceSetgeben ihren eigenen Iteratortyp wie FontFaceSet-Iterator aus ihren jeweiligen Methodenkeys(),values(),entries()und[Symbol.iterator]()zurück.
Hinweis:
NodeIterator und andere ältere Schnittstellen sind so benannt, entsprechen jedoch nicht dem Iterator-Protokoll oder dem iterierbaren Protokoll.
Jeder dieser Iteratoren hat ein unterschiedliches Prototypobjekt, das die next()-Methode definiert, die von dem jeweiligen Iterator verwendet wird. Beispielsweise erben alle String-Iterator-Objekte von einem versteckten Objekt StringIteratorPrototype, das eine next()-Methode hat, die diesen String nach Codepunkten iteriert. StringIteratorPrototype hat auch eine [Symbol.toStringTag]-Eigenschaft, deren Anfangswert die Zeichenkette "String Iterator" ist. Diese Eigenschaft wird in Object.prototype.toString() verwendet. Ähnlich haben andere Iterator-Prototypen auch ihre eigenen [Symbol.toStringTag]-Werte, die den oben genannten Namen entsprechen.
Alle diese Prototypobjekte erben von Iterator.prototype, das eine [Symbol.iterator]()-Methode bereitstellt, die das Iterator-Objekt selbst zurückgibt, wodurch der Iterator auch iterierbar wird.
Iterator-Hilfsmethoden
Hinweis:
Diese Methoden sind Iterator-Hilfen, keine iterierbaren Hilfen, da die einzige Anforderung für ein Objekt, iterierbar zu sein, nur das Vorhandensein einer [Symbol.iterator]()-Methode ist. Es gibt keinen gemeinsamen Prototypen, um diese Methoden zu installieren.
Die Iterator-Klasse selbst bietet einige Hilfsmethoden zur Arbeit mit Iteratoren. Zum Beispiel 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);
Dies konvertiert zuerst den Iterator, der von Map.prototype.values() zurückgegeben wird, in ein Array und verwendet dann die Array.prototype.reduce()-Methode, um die Summe zu berechnen. Allerdings wird hierbei sowohl ein Zwischen-Array erstellt als auch das Array zweimal durchlaufen. Stattdessen können Sie die reduce()-Methode des Iterators selbst verwenden:
const totalDeposit = nameToDeposit.values().reduce((a, b) => a + b);
Diese Methode kann speichertechnisch effizienter sein, da sie den Iterator nur einmal durchläuft, ohne Zwischenwerte zu speichern. Iterator-Hilfsmethoden sind notwendig, um mit unendlichen Iteratoren zu arbeiten:
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 konvertieren, da es unendlich ist. Stattdessen können Sie die find()-Methode des Iterators selbst verwenden, die seq nur so weit durchläuft, wie nötig, um den ersten Wert zu finden, der die Bedingung erfüllt.
Sie finden viele Iterator-Methoden, die analog zu Array-Methoden sind, wie:
Iterator.prototype.drop() und Iterator.prototype.take() zusammen sind etwas analog zu Array.prototype.slice().
Iterator-Hilfeobjekte
Hinweis: Iterator-Hilfeobjekte und Iterator-Hilfsmethoden sind zwei verschiedene Konzepte. Ein Iterator-Hilfeobjekt kann zur Laufzeit erkannt werden, während "Iterator-Hilfsmethode" nur ein Begriff für eine Menge von Methoden zur Verständnishilfe ist. Iterator Helper kann sich je nach Kontext auf das Objekt oder die Methode beziehen.
Unter den Iterator-Hilfsmethoden geben filter(), flatMap(), map(), drop() und take() ein neues Iterator-Hilfeobjekt zurück. Der Iterator-Helper ist auch eine Iterator-Instanz, wodurch diese Hilfsmethoden kaskadierbar sind. Alle Iterator-Hilfeobjekte 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.
Der Iterator-Helper teilt die gleiche Datenquelle wie der zugrunde liegende Iterator, sodass das Iterieren des Iterator-Helpers dazu führt, dass der zugrunde liegende Iterator ebenfalls iteriert wird. Es gibt keine Möglichkeit, einen Iterator zu "verzweigen", um ihn mehrmals iterieren zu lassen.
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
Richtige Iteratoren
Es gibt zwei Arten von "Iteratoren": Objekte, die dem Iterator-Protokoll entsprechen (was im Mindestmaß nur die Anwesenheit einer next()-Methode erfordert), und Objekte, die von der Iterator-Klasse erben, welche die Hilfsmethoden bereitstellt. Sie bedingen einander nicht — Objekte, die von Iterator erben, werden nicht automatisch zu Iteratoren, da die Iterator-Klasse keine next()-Methode definiert. Stattdessen muss das Objekt selbst eine next()-Methode definieren. Ein richtiger Iterator ist einer, der sowohl dem Iterator-Protokoll entspricht als auch von Iterator erbt, und die meiste Software erwartet, dass Iteratoren richtige Iteratoren sind und iterierbare Objekte richtige Iteratoren zurückgeben. Um richtige Iteratoren zu erstellen, definieren Sie eine Klasse, die von Iterator erbt, oder verwenden Sie die Iterator.from()-Methode.
class MyIterator extends Iterator {
next() {
// …
}
}
const myIterator = Iterator.from({
next() {
// …
},
});
Konstruktor
Iterator()-
Soll von anderen Klassen, die Iteratoren erstellen, erweitert werden. Löst einen Fehler aus, wenn sie selbst konstruiert wird.
Statische Methoden
Iterator.concat()-
Erstellt ein neues
Iterator-Objekt aus einer Liste von iterierbaren Objekten. Der neue Iterator liefert die Werte aus jedem der Eingabe-Iterables der Reihe nach. Iterator.from()-
Erstellt ein neues
Iterator-Objekt aus einem Iterator oder iterierbaren Objekt. Iterator.zip()-
Erstellt ein neues
Iterator-Objekt, das Elemente aus mehreren iterierbaren Objekten aggregiert, indem es Arrays zurückgibt, die Elemente an der gleichen Position enthalten. Iterator.zipKeyed()-
Erstellt ein neues
Iterator-Objekt, das Elemente aus mehreren iterierbaren Objekten aggregiert, indem es Objekte zurückgibt, die Elemente an der gleichen Position mit den von der Eingabe angegebenen Schlüsseln enthalten.
Instanz-Eigenschaften
Diese Eigenschaften sind auf Iterator.prototype definiert und werden von allen Iterator-Instanzen geteilt.
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
[Symbol.toStringTag]-Eigenschaft ist die Zeichenkette"Iterator". Diese Eigenschaft wird inObject.prototype.toString()verwendet.Hinweis: Anders als das
[Symbol.toStringTag]der meisten eingebauten Klassen istIterator.prototype[Symbol.toStringTag]aus Gründen der Webkompatibilität beschreibbar.
Instanz-Methoden
Iterator.prototype.drop()-
Gibt ein neues Iterator-Hilfeobjekt zurück, das die angegebene Anzahl von Elementen am Anfang dieses Iterators überspringt.
Iterator.prototype.every()-
Gibt
falsezurück, wenn es ein Element findet, das die bereitgestellte Testfunktion nicht erfüllt. Andernfalls, wenn der Iterator erschöpft ist, ohne ein solches Element gefunden zu haben, wirdtruezurückgegeben. Iterator.prototype.filter()-
Gibt ein neues Iterator-Hilfeobjekt zurück, das nur jene Elemente des Iterators liefert, für die die bereitgestellte Rückruffunktion
truezurückgibt. Iterator.prototype.find()-
Gibt das erste Element zurück, das vom Iterator produziert wird und die bereitgestellte Testfunktion erfüllt. Wenn keine Werte die Testfunktion erfüllen, wird
undefinedzurückgegeben. Iterator.prototype.flatMap()-
Gibt ein neues Iterator-Hilfeobjekt zurück, das jedes Element im ursprünglichen Iterator nimmt, es durch eine Abbildungsfunktion laufen lässt und die Elemente liefert, die von der Abbildungsfunktion (die sich in einem anderen Iterator oder iterierbaren Objekt befinden) zurückgegeben werden.
Iterator.prototype.forEach()-
Führt eine bereitgestellte Funktion einmal für jedes vom Iterator produzierte Element aus.
Iterator.prototype.includes()-
Gibt
truezurück, wenn ein vom Iterator produziertes Element dem angegebenen Wert entspricht. Andernfalls, wenn der Iterator erschöpft ist, ohne ein solches Element gefunden zu haben, wirdfalsezurückgegeben. Iterator.prototype.join()-
Gibt eine Zeichenkette zurück, die die Verkettung aller vom Iterator produzierten Elemente ist, getrennt durch Kommata oder einen angegebenen Trennzeichen-String.
Iterator.prototype.map()-
Gibt ein neues Iterator-Hilfeobjekt zurück, das Elemente des Iterators liefert, die jeweils durch eine Abbildungsfunktion transformiert werden.
Iterator.prototype.reduce()-
Führt eine vom Benutzer bereitgestellte "Reducer"-Rückruffunktion auf jedem vom Iterator produzierten Element aus und übergibt den Rückgabewert der Berechnung des vorherigen Elements. Das endgültige Ergebnis des Reducers über alle Elemente hinweg ist ein einzelner Wert.
Iterator.prototype.some()-
Gibt
truezurück, wenn es ein Element findet, das die bereitgestellte Testfunktion erfüllt. Andernfalls, wenn der Iterator erschöpft ist, ohne ein solches Element gefunden zu haben, wirdfalsezurückgegeben. Iterator.prototype.take()-
Gibt ein neues Iterator-Hilfeobjekt zurück, das die angegebene Anzahl von Elementen in diesem Iterator liefert und dann endet.
Iterator.prototype.toArray()-
Erstellt eine neue
Array-Instanz, die mit den vom Iterator gelieferten Elementen gefüllt ist. Iterator.prototype[Symbol.dispose]()-
Ruft die
return()-Methode vonthisauf, falls sie existiert. Dies implementiert das Disposable-Protokoll und erlaubt es, beim Gebrauch mitusingoderawait usingentsorgt zu werden. Iterator.prototype[Symbol.iterator]()-
Gibt das Iterator-Objekt selbst zurück. Dies ermöglicht es, dass Iterator-Objekte auch iterierbar sind.
Beispiele
>Einen Iterator als iterierbar verwenden
Alle eingebauten Iteratoren sind auch iterierbar, sodass Sie sie in einer for...of Schleife verwenden können:
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> |