В ES6 iterable — это объект, который допускает for... of
и имеет Symbol.iterator ключ.
Массивы являются итерируемыми, как и множества и карты. Вопрос в том, являются ли HTMLCollection и NodeList iterables? Они должны быть?
Документация MDN, кажется, предполагает, что NodeList
является итерируемым.
Циклы
for...of
будут корректно перебирать объекты NodeList в браузерах, поддерживающихfor...of
(например, Firefox 13 и более поздние версии).
Похоже, это подтверждает поведение Firefox.
Я протестировал следующий код как в Chrome, так и в Firefox и был удивлен, обнаружив, что Firefox, похоже, считает их итерируемыми, а Chrome — нет. Кроме того, Firefox считает, что итераторы, возвращаемые HTMLCollection
и NodeList
, являются одними и теми же.
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>
Одна действительно странная и запутанная вещь: запуск фрагмента кода дает результат, отличный от его копирования и запуска в реальном файле/консоли в Firefox (особенно последнее сравнение). Любое просвещение по этому странному поведению здесь тоже будет оценено.