En JavaScript, un itérateur est un objet qui définit une séquence et potentiellement une valeur de retour à sa fin.
Plus précisément, un itérateur est tout objet qui implémente le protocole Itérateur en ayant une méthode next()
qui renvoie un objet avec deux propriétés :
value
La valeur suivante dans la séquence d’itération. done
Il s’agit de true
si la dernière valeur de la séquence a déjà été consommée. Si value
est présent à côté de done
, c’est la valeur de retour de l’itérateur.
Une fois créé, un objet itérateur peut être itéré explicitement en appelant à plusieurs reprises next()
. On dit qu’itérer sur un itérateur consomme l’itérateur, car il n’est généralement possible de le faire qu’une seule fois. Une fois qu’une valeur de terminaison a été générée, des appels supplémentaires à next()
doivent continuer à renvoyer {done: true}
.
L’itérateur le plus courant en JavaScript est l’itérateur de tableau, qui renvoie chaque valeur du tableau associé en séquence.
Bien qu’il soit facile d’imaginer que tous les itérateurs puissent être exprimés sous forme de tableaux, ce n’est pas vrai. Les tableaux doivent être alloués dans leur intégralité, mais les itérateurs ne sont consommés que si nécessaire. Pour cette raison, les itérateurs peuvent exprimer des séquences de taille illimitée, telles que la plage d’entiers entre 0
et Infinity
.
Voici un exemple qui peut faire exactement cela. Il permet la création d’un itérateur de plage simple qui définit une séquence d’entiers de start
(inclus) à end
(exclusif) espacés step
à part. Sa valeur de retour finale est la taille de la séquence qu’elle a créée, suivie par la variable iterationCount
.
function makeRangeIterator(start = 0, end = Infinity, step = 1) { let nextIndex = start; let iterationCount = 0; const rangeIterator = { next: function() { let result; if (nextIndex < end) { result = { value: nextIndex, done: false } nextIndex += step; iterationCount++; return result; } return { value: iterationCount, done: true } } }; return rangeIterator;}
L’utilisation de l’itérateur ressemble alors à ceci:
const it = makeRangeIterator(1, 10, 2);let result = it.next();while (!result.done) { console.log(result.value); // 1 3 5 7 9 result = it.next();}console.log("Iterated over sequence of size: ", result.value); //
Remarque: Il n’est pas possible de savoir de manière réfléchie si un objet particulier est un itérateur. Si vous devez le faire, utilisez Iterables.