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 bietet eine [Symbol.iterator]()-Methode, die das Iterator-Objekt selbst zurückgibt, wodurch der Iterator auch iterable ist. Sie bietet auch einige Hilfsmethoden für die Arbeit 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 Helper-Methoden wie
Iterator.prototype.filter()undIterator.prototype.map()zurückgegeben wird.
Web-APIs können ebenfalls Iteratoren zurückgeben. Einige wiederverwenden core JavaScript-Iteratoren, 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 aus Web-APIs wie
Headersgeben ihren eigenen Iteratortyp wie Headers-Iterator von ihren jeweiligen Methodenkeys(),values(),entries()und[Symbol.iterator]()zurück. - Set-ähnliche Objekte aus 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 zwar so benannt, entsprechen aber nicht dem Iterator-Protokoll oder iterable-Protokoll.
Jeder dieser Iteratoren hat ein eindeutiges Prototyp-Objekt, das die next()-Methode definiert, die vom jeweiligen Iterator verwendet wird. Zum Beispiel erben alle String-Iterator-Objekte von einem versteckten 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. Ähnlich haben andere Iterator-Prototypen auch ihre eigenen [Symbol.toStringTag]-Werte, die mit den oben genannten Namen übereinstimmen.
Alle diese Prototyp-Objekte erben von Iterator.prototype, der eine [Symbol.iterator]()-Methode bereitstellt, die das Iterator-Objekt selbst zurückgibt, wodurch der Iterator auch iterable ist.
Iterator Helper-Methoden
Hinweis:
Diese Methoden sind Iterator-Hilfsmethoden, nicht iterable-Hilfsmethoden, da die einzige Voraussetzung für ein Objekt, um iterable zu sein, nur das Vorhandensein einer [Symbol.iterator]()-Methode ist. Es gibt keinen gemeinsamen Prototyp, auf dem diese Methoden installiert werden können.
Die Iterator-Klasse selbst bietet einige Hilfsmethoden für die 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 von Map.prototype.values() zurückgegebenen Iterator in ein Array und verwendet dann die Array.prototype.reduce()-Methode, um die Summe zu berechnen. Dies erstellt jedoch sowohl ein Zwischenarray 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 speichermäßig, da sie den Iterator nur einmal iteriert, ohne Zwischenwerte zu speichern. Iterator-Hilfsmethoden sind erforderlich, 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 notwendig, um den ersten Wert zu finden, der die Bedingung erfüllt.
Sie werden viele Iterator-Methoden finden, die analog zu Array-Methoden sind, wie:
Iterator.prototype.drop() und Iterator.prototype.take() kombiniert sind in gewisser Weise analog zu Array.prototype.slice().
Iterator Helper-Objekte
Hinweis: Iterator Helper-Objekte und Iterator Helper-Methoden sind zwei verschiedene Konzepte. Ein Iterator Helper-Objekt ist zur Laufzeit erkennbar, während "Iterator Helper-Methode" nur ein Name für eine Reihe von Methoden zur Veranschaulichung ist. Iterator Helper kann sich je nach Kontext entweder auf das Objekt oder die Methode beziehen.
Unter den Iterator Helper-Methoden geben filter(), flatMap(), map(), drop(), und take() ein neues Iterator Helper-Objekt zurück. Der Iterator Helper ist ebenfalls eine Iterator-Instanz, wodurch diese Hilfsmethoden kaskadierbar sind. Alle Iterator Helper-Objekte 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 Helper teilt die gleiche Datenquelle wie der zugrunde liegende Iterator, sodass das Iterieren des Iterator Helpers auch den zugrunde liegenden Iterator iteriert. Es gibt keine Möglichkeit, einen Iterator zu "verzweigen", um ihn mehrmals zu iterieren.
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, die die Hilfsmethoden genießen. Sie schließen sich nicht gegenseitig ein — 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 Iterable 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 erweitert werden, die Iteratoren erstellen. Löst einen Fehler aus, wenn es alleine konstruiert wird.
Statische Methoden
Iterator.concat()-
Erstellt ein neues
Iterator-Objekt aus einer Liste iterabler Objekte. Der neue Iterator gibt die Werte aus jedem der Eingabe-Iterables in der Reihenfolge zurück. Iterator.from()-
Erstellt ein neues
Iterator-Objekt aus einem Iterator oder iterablem Objekt. Iterator.zip()Experimentell-
Erstellt ein neues
Iterator-Objekt, das Elemente aus mehreren iterierbaren Objekten aggregiert, indem es Arrays zurückgibt, die Elemente an derselben Position enthalten. Iterator.zipKeyed()Experimentell-
Erstellt ein neues
Iterator-Objekt, das Elemente aus mehreren iterierbaren Objekten aggregiert, indem es Objekte mit Elementen an derselben Position zurückgibt, wobei die Schlüssel von der Eingabe spezifiziert werden.
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 der String"Iterator". Diese Eigenschaft wird inObject.prototype.toString()verwendet.Hinweis: Im Gegensatz zum
[Symbol.toStringTag]bei den meisten eingebauten Klassen istIterator.prototype[Symbol.toStringTag]aus Gründen der Webkompatibilität beschreibbar.
Instanz-Methoden
Iterator.prototype.drop()-
Gibt ein neues Iterator Helper-Objekt 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 ohne ein solches Element erschöpft ist, wirdtruezurückgegeben. Iterator.prototype.filter()-
Gibt ein neues Iterator Helper-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 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 Helper-Objekt zurück, das jedes Element im ursprünglichen Iterator nimmt, es durch eine Mapping-Funktion laufen lässt und die von der Mapping-Funktion zurückgegebenen Elemente liefert (die sich in einem anderen Iterator oder Iterable befinden).
Iterator.prototype.forEach()-
Führt eine bereitgestellte Funktion einmal für jedes vom Iterator produzierte Element aus.
Iterator.prototype.map()-
Gibt ein neues Iterator Helper-Objekt zurück, das Elemente des Iterators liefert, die jeweils durch eine Mapping-Funktion transformiert werden.
Iterator.prototype.reduce()-
Führt eine vom Benutzer bereitgestellte "Reducer"-Rückruffunktion auf jedes vom Iterator produzierte Element aus und übergibt den Rückgabewert aus der Berechnung am vorhergehenden Element. Das Endergebnis des Durchlaufs des Reducers über alle Elemente 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 ohne ein solches Element erschöpft ist, wirdfalsezurückgegeben. Iterator.prototype.take()-
Gibt ein neues Iterator Helper-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 disposable-Protokoll und erlaubt es, beim Verwenden mitusingoderawait usingentsorgt zu werden. Iterator.prototype[Symbol.iterator]()-
Gibt das Iterator-Objekt selbst zurück. Dies ermöglicht es, dass Iterator-Objekte auch iterable sind.
Beispiele
>Einen Iterator als Iterable verwenden
Alle eingebauten Iteratoren sind auch iterable, 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> |