Un itérable est-il le même qu'un itérateur, ou sont-ils différents?
Il semble, d' après les spécifications , qu'un itérable est un objet, disons, obj
tel qu'il obj[Symbol.iterator]
fait référence à une fonction, de sorte que lorsqu'il est invoqué, retourne un objet qui a une next
méthode qui peut retourner un {value: ___, done: ___}
objet:
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)
Donc, dans le code ci-dessus, bar
est l'itérable, et wah
est l'itérateur, et next()
est l'interface d'itérateur.
Donc, itérable et itérateur sont des choses différentes.
Maintenant, cependant, dans un exemple courant de générateur et d'itérateur:
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
Dans le cas ci-dessus, gen1
est le générateur et iter1
l'itérateur, et iter1.next()
fera le bon travail. Mais iter1[Symbol.iterator]
donne une fonction qui, lorsqu'elle est invoquée, donne en retour iter1
, qui est un itérateur. iter1
Est donc à la fois un itérable et un itérateur dans ce cas?
En outre, iter1
est différent de l'exemple 1 ci-dessus, car l'itérable de l'exemple 1 peut donner [1, 3, 5]
autant de fois que souhaité en utilisant [...bar]
, tandis que iter1
est un itérable, mais puisqu'il retourne lui-même, qui est le même itérateur à chaque fois, ne donnera [1, 3, 5]
qu'une seule fois.
Nous pouvons donc dire, pour un itérable bar
, combien de fois peut [...bar]
donner le résultat [1, 3, 5]
- et la réponse est, cela dépend. Et est-il itérable comme un itérateur? Et la réponse est, ce sont des choses différentes, mais elles peuvent être les mêmes, lorsque l'itérable se sert lui-même d'itérateur. Est-ce exact?
iter1
est-ce à la fois un itérable et un itérateur dans ce cas? " - oui. Tous les itérateurs natifs sont également itérables en se retournant, de sorte que vous pouvez facilement les passer dans des constructions qui attendent un itérable.