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-Ergebnis-Objekt 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 iterierbar wird. 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-Hilfsmethoden wie
Iterator.prototype.filter()
undIterator.prototype.map()
zurückgegeben wird.
Web-APIs können auch Iteratoren zurückgeben. Einige verwenden Kern-JavaScript-Iteratoren wieder, während andere ihre eigenen Iteratoren definieren. Zum Beispiel:
- Array-ähnliche Objekte wie
NodeList
geben einen Array Iterator über ihre jeweiligen Methodenkeys()
,values()
,entries()
und[Symbol.iterator]()
zurück. - Map-ähnliche Objekte aus Web-APIs wie
Headers
geben ihren eigenen Iteratortyp, wie den Headers Iterator, über ihre jeweiligen Methodenkeys()
,values()
,entries()
und[Symbol.iterator]()
zurück. - Set-ähnliche Objekte aus Web-APIs wie
FontFaceSet
geben ihren eigenen Iteratortyp, wie den FontFaceSet Iterator, über ihre jeweiligen Methodenkeys()
,values()
,entries()
und[Symbol.iterator]()
zurück.
Note:
NodeIterator
und andere alte Schnittstellen sind so benannt, entsprechen jedoch nicht dem Iterator-Protokoll oder dem iterierbaren Protokoll.
Jeder dieser Iteratoren hat ein eigenes Prototyp-Objekt, das die next()
-Methode definiert, die von dem speziellen Iterator verwendet wird. Zum Beispiel erben alle String-Iterator-Objekte von einem versteckten Objekt namens StringIteratorPrototype
, welches 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 eigene [Symbol.toStringTag]
-Werte, die mit den oben genannten Namen übereinstimmen.
All diese Prototyp-Objekte erben von Iterator.prototype
, welches eine [Symbol.iterator]()
-Methode bereitstellt, die das Iterator-Objekt selbst zurückgibt und den Iterator somit auch iterierbar macht.
Iterator-Hilfsmethoden
Hinweis: Diese Methoden sind Iterator-Hilfsmethoden, keine iterierbaren Hilfsmethoden, da die einzige Anforderung, die ein Objekt erfüllen muss, um iterierbar zu sein, die Präsenz einer [Symbol.iterator]()
-Methode ist. Es gibt keinen gemeinsamen Prototyp, um diese Methoden zu installieren.
Die Iterator
-Klasse selbst bietet einige Hilfsmethoden für die Arbeit mit Iteratoren an. 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 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 durchläuft, ohne Zwischenergebnisse 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, da 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 den Array-Methoden analog sind, wie:
Iterator.prototype.drop()
und Iterator.prototype.take()
zusammen sind etwas analog zu Array.prototype.slice()
.
Iterator-Hilfe-Objekte
Note: Iterator-Hilfe-Objekte und Iterator-Hilfsmethoden sind zwei unterschiedliche Konzepte. Ein Iterator-Hilfe-Objekt ist zur Laufzeit erkennbar, während "Iterator-Hilfsmethode" nur ein Name für eine Menge von Methoden zur Verständnis ist. Iterator-Hilfe kann sich entweder auf das Objekt oder die Methode, abhängig vom Kontext, beziehen.
Unter den Iterator-Hilfsmethoden geben filter()
, flatMap()
, map()
, drop()
und take()
ein neues Iterator-Hilfe-Objekt zurück. Der Iterator-Helfer ist auch eine Iterator
-Instanz, was diese Hilfsmethoden verkettbar macht. Alle Iterator-Hilfe-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-Helfer teilt die gleiche 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", 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
Echte 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 und daher die Hilfsmethoden nutzen können. 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 eine next()
-Methode selbst 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 iterierbare Objekte richtige Iteratoren zurückgeben. Um richtige Iteratoren zu erstellen, definieren Sie eine Klasse, die Iterator
erweitert, oder verwenden Sie die Methode Iterator.from()
.
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 sie von sich 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 von allen Iterator
-Instanzen gemeinsam genutzt.
Iterator.prototype.constructor
-
Die Konstruktorfunktion, die das Instanzobjekt erstellt hat. Bei
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 Web-Kompatibilität beschreibbar.
Instanz-Methoden
Iterator.prototype.drop()
-
Gibt ein neues Iterator-Hilfe-Objekt zurück, das die gegebene Anzahl an Elementen am Anfang dieses Iterators überspringt.
Iterator.prototype.every()
-
Überprüft, ob alle vom Iterator erzeugten Elemente den durch die bereitgestellte Funktion implementierten Test bestehen.
Iterator.prototype.filter()
-
Gibt ein neues Iterator-Hilfe-Objekt zurück, das nur diejenigen Elemente des Iterators ausgibt, 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 ein neues Iterator-Hilfe-Objekt zurück, das jedes Element im ursprünglichen Iterator durch eine Mapping-Funktion führt und die von der Mapping-Funktion zurückgegebenen Elemente ausgibt (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 ein neues Iterator-Hilfe-Objekt zurück, das die Elemente des Iterators ausgibt, die jeweils durch eine Mapping-Funktion transformiert wurden.
Iterator.prototype.reduce()
-
Führt eine benutzerdefinierte "Reducer"-Callback-Funktion auf jedem vom Iterator erzeugten Element aus und übergibt den Rückgabewert der Berechnung des vorhergehenden Elements. Das Endergebnis des Reducers über alle Elemente ist ein einziger Wert.
Iterator.prototype.some()
-
Überprüft, ob mindestens ein Element im Iterator den durch die bereitgestellte Funktion implementierten Test besteht. Es wird ein Boolescher Wert zurückgegeben.
Iterator.prototype.take()
-
Gibt ein neues Iterator-Hilfe-Objekt zurück, das die gegebene Anzahl von Elementen in diesem Iterator ausgibt und dann terminiert.
Iterator.prototype.toArray()
-
Erstellt eine neue
Array
-Instanz, die mit den vom Iterator ausgegebenen Elementen populiert ist. Iterator.prototype[Symbol.iterator]()
-
Gibt das Iterator-Objekt selbst zurück. Dies erlaubt es Iterator-Objekten, auch iterierbar zu sein.
Beispiele
Verwenden eines Iterators als iterierbares Objekt
Alle eingebauten Iteratoren sind auch iterierbar, daher können Sie sie in einer for...of
-Schleife verwenden:
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