W ES6 obiekt for... of
jest obiektem, który ma klucz Symbol.iterator.Czy są to iterables HTMLCollection i NodeList?
Tablice są iterables, podobnie jak zestawy i mapy. Pytanie brzmi: czy iterables są HTMLCollection i NodeList? Czy oni powinni być?
Dokumentacja MDN wydaje się sugerować, że NodeList
jest iterable.
for...of
pętle będzie pętla na liście węzłów obiektów poprawnie w przeglądarkach obsługującychfor...of
(jak Firefox 13 i później)
To wydaje się potwierdzać zachowanie Firefoksa.
Przetestowałem poniższy kod zarówno w przeglądarce Chrome, jak i Firefox. Zaskoczyło mnie, że Firefox wydaje się, że są to iterables, ale Chrome nie. Ponadto Firefox uważa, że iteratory zwrócone przez HTMLCollection
i NodeList
są jednym i tym samym.
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>
One naprawdę dziwne, mylące rzeczą: bieganie fragment kodu daje inny wynik z kopiowanie i działa w rzeczywistym pliku/konsoli w Firefoksie (szczególnie ostatni porównanie). Powinno być docenione również wszelkie oświecenie w tym dziwnym zachowaniu.
to nie jest iterable w Chrome, ale to ma być. Zobacz [Wydanie 401699: Dodaj obsługę iteratora do NodeList i znajomych] (https://code.google.com/p/chromium/issues/detail?id=401699) – lyschoening
Możesz chcieć sprawdzić [NodeList.js] (https : //github.com/eorroe/NodeList.js) –
To też nie jest możliwe do sprawdzenia w Safari. – Barmar