Les protocoles et objets Iterable et Iterateur en JavaScript

« Itérer » signifie, en français classique, « répéter » ou « faire une deuxième fois ». En JavaScript, un objet est dit « itérable » si celui-ci a été créé de façon à ce qu’on puisse parcourir ses valeurs une à une. Un objet est dit « itérateur » s’il permet de parcourir les valeurs d’un itérable.

 

L’utilité des protocoles iterable et iterateur

Certains types d’objets, comme String et Array ou encore les API Map et Set sont des itérables natifs : on va pouvoir parcourir leurs valeurs une à une en utilisant des boucles par exemple.

Cependant, les objets Object qu’on va créer manuellement ne bénéficient pas par défaut de cette fonctionnalité. Or, on voudra souvent faire en sorte que nos objets puissent être parcourus valeur par valeur.

Pour cela, le JavaScript met à notre disposition depuis 2015 deux protocoles : les protocoles itérateur et itérable. Ces protocoles vont pouvoir être implémentés par n’importe quels objets du moment que ces derniers respectent certaines conventions.

 

Le protocole itérateur

Un objet implémente le protocole itérateur (on dit également par abus de langage qu’un objet « est » un itérateur) s’il dispose d’outils permettant d’accéder aux (de parcourir les) éléments d’une collection un à un.

En termes de code, un objet est un itérateur s’il implémente une méthode next(). La méthode next() est une méthode qui renvoie un objet qui possède deux propriétés done et value.

La propriété done est une valeur booléenne qui vaut false tant que l’itérateur a pu produire la prochaine valeur de la suite (c’est-à-dire tant qu’il reste des valeurs à itérer) et true lorsque l’itérateur arrive au bout de la suite (c’est-à-dire lorsqu’on arrive à la fin des valeurs de l’itérable).

La propriété value peut être n’importe quelle valeur JavaScript, renvoyée par l’itérateur. Cette propriété peut être absente lorsque done vaut true.

 

Le protocole itérable

Un objet implémente le protocole itérable (ou « est » itérable) s’il peut être parcouru valeur par valeur, c’est-à-dire s’il définit un comportement lors d’une itération (en définissant la façon dont ses valeurs doivent être parcourues par exemple).

En termes de code, un objet doit implémenter une méthode @@iterator pour être itérable. Cela signifie que l’objet (ou un des objets de sa chaîne de prototypes) doit avoir une propriété avec une clé @@iterator à laquelle on peut accéder via Symbol.iterator.

Lorsqu’on itère sur un objet itérable (en utilisant une boucle for...of par exemple), sa méthode @@iterator est appelée sans argument et l’itérateur qui est renvoyé est utilisé afin d’obtenir les valeurs sur lesquelles itérer.

See the Pen
Cours JavaScript 13.2.1
by Pierre (@pierregiraud)
on CodePen.

Notez que dans le cas d’opérations asynchrones, l’objet devra implémenter une méthode @@asyncIterator (accessible via Symbol.asyncIterator) pour être itérable.

Laisser un commentaire