JavaScript-iteraties
Itereerbare objecten zijn objecten die kunnen worden herhaald met for..of
.
Technisch gezien moeten iterables de Symbol.iterator
methode implementeren.
Itereren over een string
U kunt een for..of
lus gebruiken om de elementen van een tekenreeks te herhalen:
Voorbeeld
for (const x of "W3Schools") {
// code block to be executed
}
Itereren over een array
U kunt een for..of
lus gebruiken om de elementen van een array te herhalen:
Voorbeeld
for (const x of [1,2,3,4,5] {
// code block to be executed
}
JavaScript-iterators
Het iteratorprotocol definieert hoe een reeks waarden van een object moet worden geproduceerd.
Een object wordt een iterator wanneer het een next()
methode implementeert.
De next()
methode moet een object retourneren met twee eigenschappen:
- waarde (de volgende waarde)
- gedaan (waar of onwaar)
waarde | De waarde die door de iterator wordt geretourneerd (kan worden weggelaten als gedaan waar is) |
---|---|
gedaan |
waar als de iterator is voltooid false als de iterator een nieuwe waarde heeft geproduceerd |
Zelfgemaakt Itereerbaar
Deze iterabele keert nooit eindigend terug: 10,20,30,40,.... Everytime
next()
wordt aangeroepen:
Voorbeeld
// 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
Het probleem met een home made iterable:
Het ondersteunt de JavaScript- for..of
instructie niet.
Een JavaScript-iterable is een object met een Symbol.iterator .
De Symbol.iterator
is een functie die een functie retourneert next()
.
Een iterabel kan worden herhaald met de code: for (const x of iterable) { }
Voorbeeld
// 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};
}
};
}
Nu kunt u gebruiken for..of
for (const num of myNumbers) {
// Any Code Here
}
De methode Symbol.iterator wordt automatisch aangeroepen door for..of
.
Maar we kunnen het ook "handmatig" doen:
Voorbeeld
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// Any Code Here
}