Iterator
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
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 für die Arbeit mit Iteratoren an.
Beschreibung
Die folgenden sind alles eingebaute 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 die zentralen JavaScript-Iteratoren, 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 von 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 von Web-APIs wie
FontFaceSet
geben ihren eigenen Iteratortyp wie FontFaceSet Iterator von ihren jeweiligen Methodenkeys()
,values()
,entries()
und[Symbol.iterator]()
zurück.
Note:
NodeIterator
und andere alte Schnittstellen sind zwar so benannt, entsprechen aber nicht dem Iterator-Protokoll oder iterierbaren Protokoll.
Jeder dieser Iteratoren hat ein eigenes Prototyp-Objekt, welches die next()
Methode definiert, die von dem bestimmten Iterator verwendet wird. Zum Beispiel erben alle String-Iterator-Objekte von einem versteckten Objekt StringIteratorPrototype
, das eine next()
Methode hat, die diese Zeichenkette nach Codepunkten iteriert. StringIteratorPrototype
hat auch eine [Symbol.toStringTag]
Eigenschaft, deren Anfangswert der String "String Iterator"
ist. Diese Eigenschaft wird in Object.prototype.toString()
verwendet. Ebenso haben andere Iterator-Prototypen ihre eigenen [Symbol.toStringTag]
Werte, die denen der oben genannten Namen entsprechen.
Alle diese Prototyp-Objekte erben von Iterator.prototype
, welche eine [Symbol.iterator]()
-Methode bereitstellt, die das Iterator-Objekt selbst zurückgibt, wodurch der Iterator auch iterierbar wird.
Iterator-Hilfen
Hinweis: Diese Methoden sind Iterator-Hilfen, keine iterierbaren Hilfen, da die einzige Anforderung an ein Objekt, iterierbar zu sein, lediglich die Anwesenheit einer [Symbol.iterator]()
-Methode ist. Es gibt kein gemeinsames Prototyp, um diese Methoden zu installieren.
Die Iterator
-Klasse selbst bietet einige Hilfsmethoden für die Arbeit 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 zunächst 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 erzeugt jedoch sowohl ein Zwischen-Array als auch iteriert das Array zweimal. Stattdessen können Sie die reduce()
-Methode des Iteratoren selbst verwenden:
const totalDeposit = nameToDeposit.values().reduce((a, b) => a + b);
Diese Methode ist möglicherweise effizienter, insbesondere speichermäßig, da 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 Iteratoren selbst verwenden, die nur seq
so weit durchläuft, wie es nötig ist, 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()
zusammen sind ein wenig analog zu Array.prototype.slice()
.
Unter diesen Methoden geben filter()
, flatMap()
, map()
, drop()
und take()
ein neues Iterator Helper-Objekt zurück. Der Iterator-Helper ist auch eine Iterator
-Instanz, wodurch die Hilfsmethoden kaskadierbar werden. Alle Iterator-Helper-Objekte erben von einem gemeinsamen Prototyp-Objekt, das das Iterator-Protokoll umsetzt:
next()
-
Ruft die
next()
-Methode des zugrundeliegenden Iterators auf, wendet die Hilfsmethode auf das Ergebnis an und gibt das Ergebnis zurück. return()
-
Ruft die
return()
-Methode des zugrundeliegenden Iterators auf und gibt das Ergebnis zurück.
Der Iterator-Helper teilt dieselbe Datenquelle wie der zugrunde liegende Iterator, sodass das Iterieren des Iterator-Helpers auch dazu führt, dass der zugrunde liegende Iterator durchlaufen wird. Es gibt keine Möglichkeit, einen Iterator zu "verzweigen", um ihn mehrmals zu durchlaufen.
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 (welches im Minimalfall nur die Anwesenheit einer next()
-Methode erfordert), und Objekte, die von der Iterator
-Klasse erben, welche die Hilfsmethoden genießen. 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 meiste Software erwartet, dass Iteratoren richtige Iteratoren sind und dass Iterables 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, die Iteratoren erstellen, erweitert werden. Wirft einen Fehler, wenn es selbst konstruiert wird.
Statische Methoden
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 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]
in den meisten eingebauten Klassen istIterator.prototype[Symbol.toStringTag]
aus Gründen der Webkompatibilität beschreibbar.
Instanzmethoden
Iterator.prototype.drop()
-
Gibt einen neuen Iterator-Helper zurück, der die gegebene Anzahl von Elementen am Anfang dieses Iterators überspringt.
Iterator.prototype.every()
-
Testet, ob alle vom Iterator erzeugten Elemente den vom bereitgestellten Funktionstext implementierten Test bestehen.
Iterator.prototype.filter()
-
Gibt einen neuen Iterator-Helper zurück, der nur diejenigen Elemente des Iterators liefert, für die die bereitgestellte Callback-Funktion
true
zurü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
undefined
zurückgegeben. Iterator.prototype.flatMap()
-
Gibt einen neuen Iterator-Helper zurück, der 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 iterierbaren Objekt befinden).
Iterator.prototype.forEach()
-
Führt eine bereitgestellte Funktion einmal für jedes vom Iterator erzeugte Element aus.
Iterator.prototype.map()
-
Gibt einen neuen Iterator-Helper zurück, der Elemente des Iterators liefert, die jeweils von einer Mapping-Funktion transformiert wurden.
Iterator.prototype.reduce()
-
Führt eine vom Benutzer bereitgestellte "Reducer"-Callback-Funktion auf jedem vom Iterator erzeugten Element aus und übergibt den Rückgabewert der Berechnung des vorhergehenden Elements. Das endgültige Ergebnis der Ausführung des Reducers über alle Elemente ist ein einzelner Wert.
Iterator.prototype.some()
-
Testet, ob mindestens ein Element im Iterator den vom bereitgestellten Funktionstext implementierten Test bestehen. Es wird ein boolescher Wert zurückgegeben.
Iterator.prototype.take()
-
Gibt einen neuen Iterator-Helper zurück, der 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.iterator]()
-
Gibt das Iterator-Objekt selbst zurück. Dies ermöglicht es Iterator-Objekten, auch iterierbar zu sein.
Beispiele
Einen Iterator als iterierbar verwenden
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 Language Specification # sec-%iteratorprototype%-object |
Browser-Kompatibilität
BCD tables only load in the browser