JavaScript-Iterables
Iterierbare Objekte sind Objekte, die mit iteriert werden können for..of
.
Technisch gesehen müssen Iterables die Symbol.iterator
Methode implementieren.
Iteration über einen String
Sie können eine for..of
Schleife verwenden, um die Elemente einer Zeichenfolge zu durchlaufen:
Beispiel
for (const x of "W3Schools") {
// code block to be executed
}
Iteration über ein Array
Sie können eine for..of
Schleife verwenden, um die Elemente eines Arrays zu durchlaufen:
Beispiel
for (const x of [1,2,3,4,5] {
// code block to be executed
}
JavaScript-Iteratoren
Das Iterator-Protokoll definiert, wie eine Folge von Werten aus einem Objekt erzeugt wird.
Ein Objekt wird zu einem Iterator , wenn es eine next()
Methode implementiert.
Die next()
Methode muss ein Objekt mit zwei Eigenschaften zurückgeben:
- Wert (der nächste Wert)
- erledigt (wahr oder falsch)
Wert | Der vom Iterator zurückgegebene Wert (kann weggelassen werden, wenn done wahr ist) |
---|---|
fertig |
wahr, wenn der Iterator abgeschlossen hat, falsch , wenn der Iterator einen neuen Wert erzeugt hat |
Hausgemacht iterierbar
Diese iterierbare Rückgabe ohne Ende: 10,20,30,40,.... Everytime
next()
heißt:
Beispiel
// Home Made Iterable
function myNumbers() {
let n = 0;
return {
next: function() {
n += 10;
return {value:n, done:false};
}
};
}
// Create Iterable
const n = myNumbers();
n.next(); // Returns 10
n.next(); // Returns 20
n.next(); // Returns 30
Das Problem mit einem hausgemachten Iterable:
for..of
Die JavaScript- Anweisung wird nicht unterstützt .
Ein JavaScript-Iterable ist ein Objekt mit einem Symbol.iterator .
Das Symbol.iterator
ist eine Funktion, die eine Funktion zurückgibt next()
.
Ein Iterable kann mit folgendem Code iteriert werden:for (const x of iterable) { }
Beispiel
// Create an Object
myNumbers = {};
// Make it Iterable
myNumbers[Symbol.iterator] = function() {
let n = 0;
done = false;
return {
next() {
n += 10;
if (n == 100) {done = true}
return {value:n, done:done};
}
};
}
Jetzt können Sie verwendenfor..of
for (const num of myNumbers) {
// Any Code Here
}
Die Methode Symbol.iterator wird automatisch von aufgerufen for..of
.
Aber wir können es auch "manuell" machen:
Beispiel
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// Any Code Here
}