Iterabili JavaScript
Gli oggetti iterabili sono oggetti che possono essere ripetuti con for..of
.
Tecnicamente, gli iterabili devono implementare il Symbol.iterator
metodo.
Iterazione su una stringa
Puoi usare un for..of
ciclo per scorrere gli elementi di una stringa:
Esempio
for (const x of "W3Schools") {
// code block to be executed
}
Iterazione su un array
Puoi usare un for..of
ciclo per scorrere gli elementi di un array:
Esempio
for (const x of [1,2,3,4,5] {
// code block to be executed
}
Iteratori JavaScript
Il protocollo iteratore definisce come produrre una sequenza di valori da un oggetto.
Un oggetto diventa un iteratore quando implementa un next()
metodo.
Il next()
metodo deve restituire un oggetto con due proprietà:
- valore (il valore successivo)
- fatto (vero o falso)
valore | Il valore restituito dall'iteratore (può essere omesso se fatto è vero) |
---|---|
fatto |
true se l'iteratore ha completato false se l'iteratore ha prodotto un nuovo valore |
Iterabile fatto in casa
Questo ritorno iterabile non finisce mai: 10,20,30,40,.... Everytime
next()
viene chiamato:
Esempio
// 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
Il problema con un iterabile fatto in casa:
Non supporta l' for..of
istruzione JavaScript.
Un iterabile JavaScript è un oggetto che ha un Symbol.iterator .
La Symbol.iterator
è una funzione che restituisce una next()
funzione.
Un iterabile può essere ripetuto con il codice:for (const x of iterable) { }
Esempio
// 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};
}
};
}
Ora puoi usarefor..of
for (const num of myNumbers) {
// Any Code Here
}
Il metodo Symbol.iterator viene chiamato automaticamente da for..of
.
Ma possiamo anche farlo "manualmente":
Esempio
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// Any Code Here
}