Itérateurs et générateurs

Références

L'actualité

Librairie

L'information

Iterables

Un objet est réputé itérable s'il dispose d'une implémentation pour la propriété Symbol.iterator. Certains types intégrés comme Array, Map, Set, String, Int32Array, Uint32Array, etc... ont leur propriété Symbol.iterator déjà mis en oeuvre. La fonction Symbol.iterator sur un objet est chargée de renvoyer la liste de valeurs sur lesquelles itérer.

for..of

for..of boucle sur un objet iterable, appelant la propriété Symbol.iterator sur l'objet. Voici une simple boucle for..of sur un tableau :


for..of vs for..in

Les deux déclarations for..of et for..in parcourent les listes; les valeurs itérées sont cependant différentes, for..in retourne une liste de clés sur l'objet itéré, alors que for..of retourne une liste de valeurs des propriétés numériques de l'objet itéré.

Voici un exemple qui démontre cette distinction :

Une autre distinction est que for..in fonctionne sur n'importe quel objet; il sert à inspecter les propriétés de cet objet. for..of en revanche, s'intéresse principalement aux valeurs d'objets itérables. Les objets intégrés tels que Map et Set implémentent une propriété Symbol.iterator permettant d'accéder aux valeurs stockées.


Cibler ES5 et ES3

Lorsque vous ciblez un ES5 ou ES3, les itérateurs ne sont autorisés que sur les valeurs de type Array. Utiliser des boucles for..of sur des valeurs non-Array est une erreur, même si ces valeurs implémentent la propriété Symbol.iterator.

Le compilateur générera une boucle for simple pour une boucle for..of, par exemple :

sera généré comme :


Ciblage d'ECMAScript 2015 et supérieur

Lorsqu'il cible un moteur conforme à ECMAScipt 2015, le compilateur générera des boucles for..of pour cibler l'implémentation d'itérateur intégrée dans le moteur.