【发布时间】:2015-09-25 19:32:24
【问题描述】:
在 ES6 中,iterable 是一个允许for... of 的对象,并且有一个 Symbol.iterator 键。
数组是可迭代的,集合和映射也是。问题是:HTMLCollection 和 NodeList 是可迭代的吗?他们应该是吗?
MDN 文档似乎表明 NodeList 是可迭代的。
for...of循环将在支持for...of的浏览器(如 Firefox 13 及更高版本)中正确循环遍历 NodeList 对象
这似乎证实了 Firefox 的行为。
我在 Chrome 和 Firefox 中都测试了以下代码,并惊讶地发现 Firefox 似乎认为它们是可迭代的,但 Chrome 却没有。另外,火狐认为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>
一个非常奇怪,令人困惑的事情:运行代码 sn-p 与复制它并在 Firefox 中的实际文件/控制台中运行(特别是最后一个比较)产生不同的结果。对这里这种奇怪行为的任何启示也将不胜感激。
【问题讨论】:
-
它在 Chrome 中不是可迭代的,但它应该是。见Issue 401699: Add iterator support to NodeList and friends
-
您可能想查看NodeList.js
-
它在 Safari 中也不是可迭代的。
标签: javascript ecmascript-6 nodelist htmlcollection