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 und den Iterator auch iterierbar macht. Sie bietet auch einige Hilfsmethoden zur Arbeit mit Iteratoren.
Beschreibung
Die folgenden sind alle eingebaute JavaScript-Iteratoren:
- Der Array Iterator, zurückgegeben 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]()
. - Der String Iterator, zurückgegeben von
String.prototype[Symbol.iterator]()
. - Der Map Iterator, zurückgegeben von
Map.prototype.values()
,Map.prototype.keys()
,Map.prototype.entries()
undMap.prototype[Symbol.iterator]()
. - Der Set Iterator, zurückgegeben von
Set.prototype.values()
,Set.prototype.keys()
,Set.prototype.entries()
undSet.prototype[Symbol.iterator]()
. - Der RegExp String Iterator, zurückgegeben von
RegExp.prototype[Symbol.matchAll]()
undString.prototype.matchAll()
. - Das
Generator
-Objekt, zurückgegeben von Generator-Funktionen. - Der Segments Iterator, zurückgegeben von der
[Symbol.iterator]()
-Methode desSegments
-Objekts, das vonIntl.Segmenter.prototype.segment()
zurückgegeben wird. - Der Iterator Helper, zurückgegeben von Iterator-Hilfsmethoden wie
Iterator.prototype.filter()
undIterator.prototype.map()
.
Web-APIs können ebenfalls Iteratoren zurückgeben. Einige nutzen die Kern-JavaScript-Iteratoren wieder, während andere ihre eigenen Iteratoren definieren. Zum Beispiel:
- Array-ähnliche Objekte wie
NodeList
geben einen Array Iterator von ihren jeweiligen Methodenkeys()
,values()
,entries()
und[Symbol.iterator]()
zurück. - Map-ähnliche Objekte aus Web-APIs wie
Headers
geben ihren eigenen Iteratortyp wie Headers Iterator von ihren jeweiligen Methodenkeys()
,values()
,entries()
und[Symbol.iterator]()
zurück. - Set-ähnliche Objekte aus Web-APIs wie
FontFaceSet
geben ihren eigenen Iteratortyp wie FontFaceSet Iterator von ihren jeweiligen Methodenkeys()
,values()
,entries()
und[Symbol.iterator]()
zurück.
Hinweis:>NodeIterator
und andere alte Schnittstellen sind so benannt, entsprechen aber nicht dem Iterator-Protokoll oder dem iterierbaren Protokoll.
Jeder dieser Iteratoren hat ein eigenes Prototypenobjekt, 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 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 mit den oben angegebenen Namen übereinstimmen.
Alle diese Prototyp-Objekte erben von Iterator.prototype
, das eine [Symbol.iterator]()
-Methode bereitstellt, die das Iterator-Objekt selbst zurückgibt und den Iterator auch iterierbar macht.
Iterator-Hilfsmethoden
Hinweis:
Diese Methoden sind Iterator-Hilfen, keine iterierbaren Hilfen, da die einzige Anforderung an 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 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 wandelt den vom Map.prototype.values()
zurückgegebenen Iterator zunächst in ein Array um 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 durchläuft, ohne irgendwelche Zwischenwerte zu merken. Iterator-Hilfsmethoden sind notwendig für die Arbeit mit unendlichen Iteratoren:
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 umwandeln, 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 werden viele Iteratormethoden finden, die analogen Array-Methoden ähneln, wie z. B.:
Iterator.prototype.drop()
und Iterator.prototype.take()
zusammen sind etwas analog zu Array.prototype.slice()
.
Iterator-Hilfsobjekte
Hinweis:>Iterator-Hilfsobjekte und Iterator-Hilfsmethoden sind zwei verschiedene Konzepte. Ein Iterator-Hilfsobjekt ist zur Laufzeit erkennbar, während "Iterator-Hilfsmethode" nur ein Name für einen Satz von Methoden für das Verständnis ist. Iterator-Hilfe kann je nach Kontext entweder das Objekt oder die Methode bezeichnen.
Unter den Iterator-Hilfsmethoden geben filter()
, flatMap()
, map()
, drop()
und take()
ein neues Iterator-Hilfsobjekt zurück. Der Iterator-Helfer ist auch eine Iterator
-Instanz, wodurch diese Hilfsmethoden verkettet werden können. Alle Iterator-Hilfsobjekte 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 dazu führt, dass der zugrunde liegende Iterator ebenfalls iteriert wird. Es gibt keine Möglichkeit, einen Iterator zu "verzweigen", um ihn mehrfach 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
Korrekte 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, die die Hilfsmethoden nutzen können. Sie schließen sich nicht gegenseitig aus — 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 korrekter Iterator ist einer, der sowohl dem Iterator-Protokoll entspricht als auch von Iterator
erbt, und die meisten Code erwarten, dass Iteratoren richtige Iteratoren sind und Iterables richtige Iteratoren zurückgeben. Um korrekte Iteratoren zu erstellen, definieren Sie eine Klasse, die von Iterator
erweitert oder die Iterator.from()
-Methode verwendet.
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 es selbst konstruiert wird.
Statische Methoden
Iterator.from()
-
Erstellt ein neues
Iterator
-Objekt aus einem Iterator- oder iterable-Objekt.
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 die Zeichenkette"Iterator"
. Diese Eigenschaft wird inObject.prototype.toString()
verwendet.Hinweis: Im Gegensatz zum
[Symbol.toStringTag]
bei den meisten eingebauten Klassen istIterator.prototype[Symbol.toStringTag]
beschreibbar, aus Gründen der Webkompatibilität.
Instanzmethoden
Iterator.prototype.drop()
-
Gibt ein neues Iterator-Hilfsobjekt zurück, das die gegebene Anzahl von Elementen am Anfang dieses Iterators überspringt.
Iterator.prototype.every()
-
Testet, ob alle vom Iterator produzierten Elemente den durch die angegebene Funktion implementierten Test bestehen.
Iterator.prototype.filter()
-
Gibt ein neues Iterator-Hilfsobjekt zurück, das nur diejenigen Elemente des Iterators liefert, für die die angegebene Rückruffunktion
true
zurückgibt. Iterator.prototype.find()
-
Gibt das erste Element zurück, das vom Iterator produziert wird und die angegebene Testfunktion erfüllt. Wenn keine Werte die Testfunktion erfüllen, wird
undefined
zurückgegeben. Iterator.prototype.flatMap()
-
Gibt ein neues Iterator-Hilfsobjekt zurück, das jedes Element im ursprünglichen Iterator nimmt, es durch eine Zuordnungsfunktion laufen lässt und Elemente zurückgibt, die von der Zuordnungsfunktion zurückgegeben werden (welche sich in einem anderen Iterator oder iterable befinden).
Iterator.prototype.forEach()
-
Führt eine angegebene Funktion einmal für jedes vom Iterator erzeugte Element aus.
Iterator.prototype.map()
-
Gibt ein neues Iterator-Hilfsobjekt zurück, das Elemente des Iterators liefert, die jeweils durch eine Zuordnungsfunktion transformiert wurden.
Iterator.prototype.reduce()
-
Führt eine vom Benutzer bereitgestellte "Reducer"-Rückruffunktion auf jedes vom Iterator produzierte Element aus, indem der Rückgabewert aus der Berechnung des vorhergehenden Elements übergeben wird. Das Endergebnis des Reduzierens über alle Elemente hinweg ist ein einzelner Wert.
Iterator.prototype.some()
-
Testet, ob mindestens ein Element im Iterator den durch die angegebene Funktion implementierten Test besteht. Es gibt einen booleschen Wert zurück.
Iterator.prototype.take()
-
Gibt ein neues Iterator-Hilfsobjekt 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 befüllt 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 |