Iterator
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
* Some parts of this feature may have varying levels of support.
Ein Iterator-Objekt ist ein Objekt, das dem Iterator-Protokoll entspricht, indem es eine next()-Methode bereitstellt, die ein Iterator-Resultat-Objekt zurückgibt. Alle eingebauten Iteratoren erben von der Iterator-Klasse. Die Iterator-Klasse bietet eine [Symbol.iterator]()-Methode, die das Iterator-Objekt selbst zurückgibt, wodurch der Iterator auch iterierbar wird. Sie bietet auch einige Hilfsmethoden zur Arbeit mit Iteratoren.
Beschreibung
Folgende 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, zurückgegeben wird. - 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 nutzen Kern-JavaScript-Iteratoren wieder, während andere ihre eigenen Iteratoren definieren. Zum Beispiel:
- Array-ähnliche Objekte wie
NodeListgeben einen Array Iterator über ihre jeweilige Methodenkeys(),values(),entries(), und[Symbol.iterator]()zurück. - Map-ähnliche Objekte aus Web-APIs wie
Headersgeben ihren eigenen Iteratortyp wie Headers Iterator über ihre jeweilige Methodenkeys(),values(),entries(), und[Symbol.iterator]()zurück. - Set-ähnliche Objekte aus Web-APIs wie
FontFaceSetgeben ihren eigenen Iteratortyp wie FontFaceSet Iterator über ihre jeweilige Methodenkeys(),values(),entries(), und[Symbol.iterator]()zurück.
Hinweis:
NodeIterator und andere alte Schnittstellen sind so benannt, entsprechen jedoch nicht dem Iterator-Protokoll oder dem Iterable-Protokoll.
Jeder dieser Iteratoren hat ein eigenes Prototyp-Objekt, das die next()-Methode definiert, die von dem jeweiligen Iterator verwendet wird. Zum Beispiel erben alle String-Iterator-Objekte von einem versteckten Objekt StringIteratorPrototype, das eine next()-Methode hat, die diesen String von Codepunkten iteriert. StringIteratorPrototype hat auch eine [Symbol.toStringTag]-Eigenschaft, deren Anfangswert der String "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 gegebenen Namen gleichen.
Alle diese Prototyp-Objekte erben von Iterator.prototype, was 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 Iterable-Hilfen, weil die einzige Voraussetzung für ein Objekt, um iterierbar zu sein, nur das Vorhandensein einer [Symbol.iterator]()-Methode ist. Es gibt keinen gemeinsamen Prototyp, um diese Methoden zu installieren.
Die Iterator-Klasse selbst bietet einige Hilfsmethoden zur Arbeit mit Iteratoren. Zum Beispiel, Sie könnten 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 von Map.prototype.values() zurückgegebenen Iterator in ein Array, dann wird die Array.prototype.reduce()-Methode verwendet, um die Summe zu berechnen. Dies erstellt jedoch sowohl ein Zwischen-Array als auch iteriert 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 speicherseitig, weil sie den Iterator nur einmal durchläuft, ohne irgendwelche 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, weil es unendlich ist. Stattdessen können Sie die find()-Methode des Iterators selbst verwenden, die seq nur so weit iteriert, wie nötig, um den ersten Wert zu finden, der die Bedingung erfüllt.
Sie werden viele Iterator-Methoden finden, die den Array-Methoden analog sind, wie:
Iterator.prototype.drop() und Iterator.prototype.take() kombiniert sind in gewissem Maße analog zu Array.prototype.slice().
Iterator-Helfer-Objekte
Hinweis: Iterator-Helfer-Objekte und Iterator-Hilfsmethoden sind zwei verschiedene Konzepte. Ein Iterator-Helfer-Objekt ist zur Laufzeit erkennbar, während "Iterator-Hilfsmethode" lediglich ein Name für eine Menge von Methoden für das Verständnis ist. Iterator-Helfer kann sich entweder auf das Objekt oder die Methode beziehen, je nach Kontext.
Unter den Iterator-Hilfsmethoden geben filter(), flatMap(), map(), drop(), und take() ein neues Iterator-Helfer-Objekt zurück. Der Iterator-Helfer ist auch eine Iterator-Instanz, wodurch diese Hilfsmethoden kaskadierbar sind. Alle Iterator-Helfer-Objekte erben von einem gemeinsamen Prototyp-Objekt, das das Iterator-Protokoll umsetzt:
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-Helfer teilt die gleiche Datenquelle wie der zugrunde liegende Iterator, so dass das Iterieren des Iterator-Helfers dazu führt, dass der zugrunde liegende Iterator ebenfalls iteriert wird. Es gibt keine Möglichkeit, einen Iterator zu "verzweigen", um ihn mehrfach iterieren 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
Echte Iteratoren
Es gibt zwei Arten von "Iteratoren": Objekte, die dem Iterator-Protokoll entsprechen (was im Minimum nur das Vorhandensein einer next()-Methode erfordert), und Objekte, die von der Iterator-Klasse erben und die Hilfsmethoden nutzen. Sie bedingen sich nicht gegenseitig — Objekte, die von Iterator erben, werden nicht automatisch zu Iteratoren, weil die Iterator-Klasse keine next()-Methode definiert. Stattdessen muss das Objekt die next()-Methode selbst definieren. Ein echter Iterator ist einer, der sowohl dem Iterator-Protokoll entspricht als auch von Iterator erbt, und der Großteil des Codes erwartet von Iteratoren, dass sie echte Iteratoren sind und von Iterables, dass sie echte Iteratoren zurückgeben. Um echte Iteratoren zu erstellen, definieren Sie eine Klasse, die Iterator erweitert 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 er selbst konstruiert wird.
Statische Methoden
Iterator.concat()-
Erstellt ein neues
Iterator-Objekt aus einer Liste von iterierbaren Objekten. Der neue Iterator gibt die Werte aus jeder der Eingabe-Iterables sequenziell zurück. 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 aus Elementen gleicher Position zurückgibt. Iterator.zipKeyed()-
Erstellt ein neues
Iterator-Objekt, das Elemente aus mehreren iterierbaren Objekten aggregiert, indem es Objekte aus Elementen gleicher Position mit Schlüsseln, die durch die Eingabe spezifiziert sind, zurückgibt.
Instanzeigenschaften
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 der String"Iterator". Diese Eigenschaft wird inObject.prototype.toString()verwendet.Hinweis: Im Gegensatz zum
[Symbol.toStringTag]der meisten eingebauten Klassen istIterator.prototype[Symbol.toStringTag]aus Gründen der Web-Kompatibilität beschreibbar.
Instanzmethoden
Iterator.prototype.drop()-
Gibt ein neues Iterator-Helfer-Objekt zurück, das die angegebene Anzahl von Elementen am Anfang dieses Iterators überspringt.
Iterator.prototype.every()-
Testet, ob alle vom Iterator erzeugten Elemente den durch die bereitgestellte Funktion implementierten Test bestehen.
Iterator.prototype.filter()-
Gibt ein neues Iterator-Helfer-Objekt zurück, das nur diejenigen Elemente des Iterators liefert, für die die bereitgestellte Rückruffunktion
truezurückgibt. Iterator.prototype.find()-
Gibt das erste vom Iterator erzeugte Element zurück, das die bereitgestellte Testfunktion erfüllt. Wenn keine Werte die Testfunktion erfüllen, wird
undefinedzurückgegeben. Iterator.prototype.flatMap()-
Gibt ein neues Iterator-Helfer-Objekt zurück, das jedes Element im ursprünglichen Iterator nimmt, es durch eine Mapping-Funktion ausführt und die von der Mapping-Funktion zurückgegebenen Elemente (die sich in einem anderen Iterator oder iterablen befinden) liefert.
Iterator.prototype.forEach()-
Führt eine bereitgestellte Funktion einmal für jedes vom Iterator erzeugte Element aus.
Iterator.prototype.map()-
Gibt ein neues Iterator-Helfer-Objekt zurück, das Elemente des Iterators liefert, die jeweils durch eine Mapping-Funktion transformiert wurden.
Iterator.prototype.reduce()-
Führt eine vom Benutzer bereitgestellte "Reducer"-Rückruffunktion auf jedem vom Iterator erzeugten Element aus und überträgt den Rückgabewert aus der Berechnung des vorhergehenden Elements. Das Endergebnis des Reducer-Laufs über alle Elemente ist ein einzelner Wert.
Iterator.prototype.some()-
Testet, ob mindestens ein Element im Iterator den durch die bereitgestellte Funktion implementierten Test besteht. Es gibt einen booleschen Wert zurück.
Iterator.prototype.take()-
Gibt ein neues Iterator-Helfer-Objekt zurück, das die angegebene Anzahl von Elementen in diesem Iterator liefert und dann beendet.
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 vorhanden. Dies implementiert das empotierte Protokoll und ermöglicht es, es zu entsorgen, wenn es mitusingoderawait usingverwendet wird. Iterator.prototype[Symbol.iterator]()-
Gibt das Iterator-Objekt selbst zurück. Dies ermöglicht es Iterator-Objekten, auch iterierbar zu sein.
Beispiele
>Verwendung eines Iterators als Iterable
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
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-%iteratorprototype%-object> |