Est-ce que HTMLCollection et NodeList iterables?

Dans ES6, un iterable est un objet qui permet for... of , et a une touche Symbol.iterator.

Les tableaux sont iterables, tout comme les ensembles et les cartes. La question est: les HTMLCollection et NodeList iterables ? Sont-ils supposés être?

La documentation de MDN semble suggérer qu'un NodeList est NodeList .

for...of boucles seront sur les objets NodeList correctement, dans les navigateurs qui prennent en charge for...of (comme Firefox 13 et versions ultérieures)

Cela semble corroborer le comportement de Firefox.

J'ai testé le code suivant dans Chrome et Firefox, et j'ai été surpris de constater que Firefox semble penser qu'ils sont iterables, mais Chrome ne le fait pas. En outre, Firefox pense que les itérateurs renvoyés par HTMLCollection et NodeList sont identiques.

 var col = document.getElementsByClassName('test'); // Should get HTMLCollection of 2 elems var nod = document.querySelectorAll('.test'); // Should get NodeList of 2 elems var arr = [].slice.call(col); // Should get Array of 2 elems console.log(col[Symbol.iterator]); // Firefox: iterator function, Chrome: undefined console.log(nod[Symbol.iterator]); // Firefox: iterator function, Chrome: undefined console.log(arr[Symbol.iterator]); // Firefox & Chrome: iterator function console.log(col[Symbol.iterator] === nod[Symbol.iterator]); // Firefox: true console.log(col[Symbol.iterator] === arr[Symbol.iterator]); // Firefox: false 
 <div class="test">1</div> <div class="test">2</div> 

Une chose vraiment étrange et confuse : l'exécution de l'extrait de code produit un résultat différent de la copie et de l'exécution dans un fichier / console réel dans Firefox (en particulier la dernière comparaison). Toute illumination sur ce comportement étrange ici serait également appréciée.

Symbol.iterator support de NodeList pour NodeList , HTMLCollection , DOMTokenList et DOMSettableTokenList été discuté et ajouté aux spécifications DOM de WHATWG l' année dernière.

Malheureusement, pas encore. Mais jusqu'à ce qu'ils soient, vous pouvez facilement les appliquer comme suit:

 HTMLCollection.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator]; 

Comme l'a souligné Symbol.iterator support Symbol.iterator de NodeList pour NodeList été ajouté à la spécification DOM de WHATWG en 2014.

Malheureusement, Chrome 51 est la première version de Chrome à l'appuyer, et son Beta vient d'être publié au moment de la rédaction de cette réponse. En outre, il n'y a aucun support dans aucune version d'Internet Explorer ou Edge.

Pour ajouter Symbol.iterator support pour NodeList dans tous les navigateurs à votre code, utilisez simplement le polyfill suivant:

 NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];