Являются ли итераторы HTMLCollection и NodeList?

В 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>

Ответы

Ответ 2

К сожалению, пока нет. Но до тех пор, пока они не станут, вы можете легко polyfill их следующим образом:

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

Ответ 3

Как отметил greiner, встроенная поддержка Symbol.iterator для NodeList была добавлена ​​в спецификацию WHATWG DOM в 2014 году.

К сожалению, Chrome 51 является первой версией Chrome для ее поддержки, и ее бета-версия только что была выпущена во время написания этого ответа. Кроме того, нет поддержки в любой версии Internet Explorer или Edge.

Чтобы добавить Symbol.iterator поддержку NodeList во всех браузерах к вашему коду, используйте только polyfill:

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