ES6 では、イテラブルはを許可するオブジェクトでfor... of
あり、Symbol.iterator キーを持ちます。
配列はセットやマップと同様にイテラブルです。問題は、HTMLCollectionとNodeListはイテラブルなのかということです。彼らはそうあるべきですか?
MDN のドキュメントでは、aNodeList
がイテラブルであることを示唆しているようです。
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>
本当に奇妙で紛らわしいことが 1 つあります。コード スニペットを実行すると、それをコピーして Firefox の実際のファイル/コンソールで実行した場合とは異なる結果が生成されます (特に最後の比較)。ここでのこの奇妙な動作に関する啓発も歓迎します。