Un iterabile è lo stesso di un iteratore o sono diversi?
Sembra, dalle specifiche , che un iterabile sia un oggetto, diciamo, obj
tale che si obj[Symbol.iterator]
riferisce a una funzione, così che quando viene invocato, restituisce un oggetto che ha un next
metodo che può restituire un {value: ___, done: ___}
oggetto:
function foo() {
let i = 0;
const wah = {
next: function() {
if (i <= 2) return { value: (1 + 2 * i++), done: false }
else return { value: undefined, done: true }
}
};
return wah; // wah is iterator
}
let bar = {} // bar is iterable
bar[Symbol.iterator] = foo;
console.log([...bar]); // [1, 3, 5]
for (a of bar) console.log(a); // 1 3 5 (in three lines)
Quindi nel codice sopra, bar
è iterabile, wah
è iteratore e next()
è l'interfaccia iteratore.
Quindi, iterabile e iteratore sono cose diverse.
Ora, tuttavia, in un esempio comune di generatore e iteratore:
function* gen1() {
yield 1;
yield 3;
yield 5;
}
const iter1 = gen1();
console.log([...iter1]); // [1, 3, 5]
for (a of iter1) console.log(a); // nothing
const iter2 = gen1();
for (a of iter2) console.log(a); // 1 3 5 (in three lines)
console.log(iter1[Symbol.iterator]() === iter1); // true
Nel caso sopra, gen1
è il generatore ed iter1
è l'iteratore e iter1.next()
farà il lavoro giusto. Ma iter1[Symbol.iterator]
dà una funzione che, quando viene invocata, restituisce iter1
, che è un iteratore. Quindi iter1
è sia un iterabile che un iteratore in questo caso?
Inoltre, iter1
è diverso dall'esempio 1 sopra, perché l'iterabile nell'esempio 1 può dare [1, 3, 5]
tutte le volte che si desidera utilizzare [...bar]
, mentre iter1
è iterabile, ma poiché si restituisce da solo, che è lo stesso iteratore ogni volta, darà [1, 3, 5]
una sola volta.
Quindi possiamo dire, per un iterabile bar
, quante volte può [...bar]
dare il risultato [1, 3, 5]
- e la risposta è, dipende. Ed è iterabile lo stesso di un iteratore? E la risposta è che sono cose diverse, ma possono essere le stesse quando l'iterabile si utilizza come iteratore. È corretto?
iter1
sia un iterabile che un iteratore in questo caso? " - sì. Tutti gli iteratori nativi sono anche iterabili restituendo se stessi, in modo da poterli facilmente passare in costrutti che si aspettano un iterabile.