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, wodurch der Iterator auch iterierbar wird. Außerdem bietet sie einige Hilfsmethoden zur 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, 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.
Auch Web-APIs können Iteratoren zurückgeben. Einige wiederverwenden die Iteratoren von JavaScript, während andere ihre eigenen Iteratoren definieren. Zum Beispiel:
- Array-ähnliche Objekte wie
NodeList
geben einen Array-Iterator aus ihren jeweiligen Methodenkeys()
,values()
,entries()
und[Symbol.iterator]()
zurück. - Map-ähnliche Objekte von Web-APIs wie
Headers
geben ihren eigenen Iteratortyp wie Headers-Iterator aus ihren jeweiligen Methodenkeys()
,values()
,entries()
und[Symbol.iterator]()
zurück. - Set-ähnliche Objekte von Web-APIs wie
FontFaceSet
geben ihren eigenen Iteratortyp wie FontFaceSet-Iterator aus ihren jeweiligen 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 iterierbaren Protokoll.
Jeder dieser Iteratoren hat ein unterschiedliches 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 dessen Code-Punkte 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 genannten Namen entsprechen.
All diese Prototyp-Objekte erben von Iterator.prototype
, das eine [Symbol.iterator]()
-Methode bietet, die das Iterator-Objekt selbst zurückgibt, wodurch der Iterator auch iterierbar wird.
Iterator-Hilfsmethoden
Hinweis:
Diese Methoden sind Iterator-Helfer, nicht iterierbare Helfer, da die einzige Anforderung für ein iterierbares Objekt 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 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 kann effizienter sein, insbesondere speichermäßig, da sie den Iterator nur einmal iteriert, 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, 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 zu Array-Methoden analog sind, wie:
Iterator.prototype.drop()
und Iterator.prototype.take()
zusammen sind etwas vergleichbar mit Array.prototype.slice()
.
Iterator-Hilfeobjekte
Hinweis: Iterator-Hilfeobjekte und Iterator-Hilfsmethoden sind zwei verschiedene Konzepte. Ein Iterator-Hilfeobjekt ist zur Laufzeit erkennbar, während "Iterator-Hilfsmethode" nur ein Name für eine Satz von Methoden zur Verständnisunterstützung ist. Iterator-Hilfe kann entweder auf das Objekt oder die Methode hinweisen, je nach Kontext.
Unter den Iterator-Hilfsmethoden gibt filter()
, flatMap()
, map()
, drop()
und take()
ein neues Iterator-Hilfeobjekt zurück. Der Iterator-Helfer ist ebenfalls eine Iterator
-Instanz, wodurch diese Hilfsmethoden kaskadierbar sind. Alle Iterator-Hilfeobjekte 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 den zugrunde liegenden Iterator iteriert. Es gibt keine Möglichkeit, einen Iterator zu "verzweigen", um ihn mehrfach iterierbar zu machen.
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 (das, minimal, nur das Vorhandensein einer next()
-Methode erfordert), und Objekte, die von der Iterator
-Klasse erben, welche die Hilfsmethoden nutzen. 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 meiste Software erwartet, dass Iteratoren richtige Iteratoren sind und dass 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 erweitert werden, die Iteratoren erzeugen. Löst einen Fehler aus, wenn es selbst konstruiert wird.
Statische Methoden
Iterator.from()
-
Erstellt ein neues
Iterator
-Objekt aus einem Iterator oder iterierbaren Objekt.
Instanz-Eigenschaften
Diese Eigenschaften sind auf Iterator.prototype
definiert und werden von allen Iterator
-Instanzen geteilt.
Iterator.prototype.constructor
-
Die Konstrukturfunktion, die das Instanz-Objekt 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 zu den
[Symbol.toStringTag]
-Eigenschaften 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-Hilfeobjekt zurück, das die gegebene Anzahl von Elementen am Anfang dieses Iterators überspringt.
Iterator.prototype.every()
-
Testet, ob alle vom Iterator erzeugten Elemente den Test bestehen, der von der bereitgestellten Funktion implementiert wurde.
Iterator.prototype.filter()
-
Gibt ein neues Iterator-Hilfeobjekt zurück, das nur die Elemente des Iterators liefert, für die die bereitgestellte Callback-Funktion
true
zurü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 bestehen, wird
undefined
zurückgegeben. Iterator.prototype.flatMap()
-
Gibt ein neues Iterator-Hilfeobjekt zurück, das jedes Element im ursprünglichen Iterator durch eine Mapping-Funktion laufen lässt und die von der Mapping-Funktion zurückgegebenen Elemente liefert (die in einem anderen Iterator oder iterierbaren Objekt enthalten sind).
Iterator.prototype.forEach()
-
Führt eine bereitgestellte Funktion einmal für jedes Element aus, das vom Iterator erzeugt wird.
Iterator.prototype.map()
-
Gibt ein neues Iterator-Hilfeobjekt zurück, das die Elemente des Iterators liefert, von denen jedes durch eine Mapping-Funktion transformiert wird.
Iterator.prototype.reduce()
-
Führt eine von der Benutzerschaft bereitgestellte "Reducer"-Callback-Funktion auf jedem Element aus, das vom Iterator erzeugt wird, und gibt den Rückgabewert der Berechnung auf dem vorhergehenden Element weiter. Das Endergebnis des Durchlaufs des Reducers über alle Elemente ist ein einzelner Wert.
Iterator.prototype.some()
-
Testet, ob mindestens ein Element im Iterator den Test besteht, der von der bereitgestellten Funktion implementiert wurde. Gibt einen booleschen Wert zurück.
Iterator.prototype.take()
-
Gibt ein neues Iterator-Hilfeobjekt zurück, das die gegebene 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.iterator]()
-
Gibt das Iterator-Objekt selbst zurück. Dadurch können Iterator-Objekte ebenfalls iterierbar sein.
Beispiele
Verwenden eines Iterators als iterierbares Objekt
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 |