Являются ли HTMLCollection и NodeList итеративными?
В ES6итерируемый это объект, который позволяетfor... of
и имеет ключ Symbol.iterator.
Массивы являются итеративными, как и наборы и карты. Вопрос:HTMLCollection а такжеNodeList итерируемые? Они должны быть?
Документация 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 (особенно при последнем сравнении). Любое понимание этого странного поведения здесь также будет оценено.