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-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, was den Iterator ebenfalls iterierbar macht. Sie bietet auch einige Hilfsmethoden zum Arbeiten mit Iteratoren.
Beschreibung
Die folgenden 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 zurückgegeben wird, 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 erneut, während andere ihre eigenen Iteratoren definieren. Zum Beispiel:
- Array-ähnliche Objekte wie
NodeListgeben einen Array-Iterator von ihren jeweiligen Methodenkeys(),values(),entries()und[Symbol.iterator]()zurück. - Map-ähnliche Objekte von Web-APIs wie
Headersgeben ihren eigenen Iteratortyp wie Headers Iterator von ihren jeweiligen Methodenkeys(),values(),entries()und[Symbol.iterator]()zurück. - Set-ähnliche Objekte von Web-APIs wie
FontFaceSetgeben ihren eigenen Iteratortyp wie FontFaceSet Iterator von ihren jeweiligen Methodenkeys(),values(),entries()und[Symbol.iterator]()zurück.
Hinweis:
NodeIterator und andere alte Schnittstellen sind entsprechend benannt, entsprechen jedoch weder dem Iterator-Protokoll noch dem iterierbaren 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 verborgenen Objekt StringIteratorPrototype, das eine next()-Methode hat, die diesen String durch Codepunkte iteriert. StringIteratorPrototype hat auch eine [Symbol.toStringTag]-Eigenschaft, deren Anfangswert der String "String Iterator" ist. Diese Eigenschaft wird in Object.prototype.toString() verwendet. In ähnlicher Weise haben andere Iterator-Prototypen auch ihre eigenen [Symbol.toStringTag]-Werte, die denselben Namen haben wie die oben gegebenen.
Alle diese Prototyp-Objekte erben von Iterator.prototype, das eine [Symbol.iterator]()-Methode bereitstellt, die das Iterator-Objekt selbst zurückgibt und den Iterator ebenfalls iterierbar macht.
Iterator-Hilfsmethoden
Hinweis:
Diese Methoden sind Iterator-Hilfsmethoden, keine iterierbaren Hilfsmethoden, da die einzige Anforderung für ein Objekt, iterierbar zu sein, lediglich die Anwesenheit einer [Symbol.iterator]()-Methode ist. Es gibt keinen geteilten Prototyp, auf dem diese Methoden installiert werden können.
Die Iterator-Klasse selbst bietet einige Hilfsmethoden zum Arbeiten mit Iteratoren. 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);
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. 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 ist möglicherweise effizienter, insbesondere speicherbezogen, da sie den Iterator nur einmal iteriert, ohne Zwischenwerte zu merken. 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 iteriert, wie erforderlich, um den ersten Wert zu finden, der die Bedingung erfüllt.
Sie finden viele Iteratormethoden, die analog zu Array-Methoden sind, wie:
Iterator.prototype.drop() und Iterator.prototype.take() kombiniert sind in etwa analog zu Array.prototype.slice().
Iterator-Helferobjekte
Hinweis: Iterator-Helferobjekte und Iterator-Hilfsmethoden sind zwei unterschiedliche Konzepte. Ein Iterator-Helferobjekt ist zur Laufzeit erkennbar, während "Iterator-Hilfsmethode" nur ein Name für eine Gruppe von Methoden zur Erfassung ist. Iterator-Helfer kann sich je nach Kontext entweder auf das Objekt oder die Methode beziehen.
Unter den Iterator-Hilfsmethoden geben filter(), flatMap(), map(), drop() und take() ein neues Iterator-Helfer-Objekt zurück. Der Iterator-Helfer ist ebenfalls eine Instanz von Iterator, wodurch diese Hilfsmethoden verkettbar sind. Alle Iterator-Helferobjekte erben von einem gemeinsamen Prototyp-Objekt, 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-Helfer teilt dieselbe Datenquelle wie der zugrunde liegende Iterator, sodass das Iterieren des Iterator-Helfers auch das Iterieren des zugrunde liegenden Iterators bewirkt. Es gibt keine Möglichkeit, einen Iterator zu "verzweigen", damit er mehrfach iteriert werden kann.
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 mindestens nur das Vorhandensein einer next()-Methode erfordert), und Objekte, die von der Iterator-Klasse erben, welche die Hilfsmethoden nutzen. Sie bedingen sich nicht gegenseitig — 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 meisten Codes erwarten, dass Iteratoren richtige Iteratoren sind und Iterables richtige Iteratoren zurückgeben. Um richtige Iteratoren zu erstellen, definieren Sie eine Klasse, die von Iterator erweitert wird, oder verwenden Sie die Iterator.from()-Methode.
class MyIterator extends Iterator {
next() {
// …
}
}
const myIterator = Iterator.from({
next() {
// …
},
});
Konstruktor
Iterator()-
Soll von anderen Klassen erweitert werden, die Iteratoren erstellen. Wirft einen Fehler, wenn er selbst instanziiert wird.
Statische Methoden
Iterator.concat()-
Erstellt ein neues
Iterator-Objekt aus einer Liste von iterierbaren Objekten. Der neue Iterator liefert die Werte der Eingabe-Iterablen in der Reihenfolge. Iterator.from()-
Erstellt ein neues
Iterator-Objekt aus einem Iterator- oder iterierbaren Objekt.
Instanzeigenschaften
Diese Eigenschaften sind auf Iterator.prototype definiert und werden von allen Iterator-Instanzen geteilt.
Iterator.prototype.constructor-
Die Konstrukturfunktion, 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]in den meisten eingebauten Klassen istIterator.prototype[Symbol.toStringTag]beschreibbar aus Gründen der Webkompatibilität.
Instanzmethoden
Iterator.prototype.drop()-
Gibt ein neues Iterator-Helferobjekt zurück, das die gegebene Anzahl an Elementen am Anfang dieses Iterators überspringt.
Iterator.prototype.every()-
Prüft, ob alle vom Iterator produzierten Elemente den Test bestehen, der von der bereitgestellten Funktion implementiert wird.
Iterator.prototype.filter()-
Gibt ein neues Iterator-Helferobjekt zurück, das nur diejenigen 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 erzeugt wird und die bereitgestellte Testfunktion erfüllt. Wenn keine Werte die Testfunktion erfüllen, wird
undefinedzurückgegeben. Iterator.prototype.flatMap()-
Gibt ein neues Iterator-Helferobjekt zurück, das jedes Element im Original-Iterator nimmt, es durch eine Abbildungsfunktion leitet und Elemente liefert, die von der Abbildungsfunktion zurückgegeben werden (die in einem anderen Iterator oder iterierbaren Objekt enthalten sind).
Iterator.prototype.forEach()-
Führt eine bereitgestellte Funktion einmal für jedes vom Iterator produzierte Element aus.
Iterator.prototype.map()-
Gibt ein neues Iterator-Helferobjekt zurück, das Elemente des Iterators liefert, die jeweils durch eine Abbildungsfunktion transformiert wurden.
Iterator.prototype.reduce()-
Führt eine vom Benutzer bereitgestellte "Reducer"-Rückruffunktion auf jedes vom Iterator produzierte Element aus, wobei der Rückgabewert der Berechnung des vorhergehenden Elements weitergegeben wird. Das Endergebnis des Durchlaufens des Reducers über alle Elemente ist ein einzelner Wert.
Iterator.prototype.some()-
Prüft, ob mindestens ein Element im Iterator den Test besteht, der von der bereitgestellten Funktion implementiert wird. Es gibt einen booleschen Wert zurück.
Iterator.prototype.take()-
Gibt ein neues Iterator-Helferobjekt zurück, das die gegebene 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 befüllt ist. Iterator.prototype[Symbol.dispose]()-
Ruft die
return()-Methode vonthisauf, falls vorhanden. Dies implementiert das disposable protocol und ermöglicht es, es zu entsorgen, wenn es mitusingoderawait usingverwendet wird. Iterator.prototype[Symbol.iterator]()-
Gibt das Iterator-Objekt selbst zurück. Dadurch können Iterator-Objekte auch iterierbar sein.
Beispiele
>Verwenden eines Iterators als Iterable
Alle eingebauten Iteratoren sind ebenfalls 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> |