javascript - HTMLCollection 和 NodeList 是可迭代的吗?

标签 javascript ecmascript-6 nodelist htmlcollection

在 ES6 中,iterable是一个允许for...of的对象,并且有一个Symbol.iterator键。

数组是可迭代的,集合和映射也是如此。问题是:是HTMLCollectionNodeList可迭代?他们应该是吗?

MDN 文档似乎表明 NodeList 是一个可迭代对象。

for...of loops will loop over NodeList objects correctly, in browsers that support for...of (like Firefox 13 and later)

这似乎证实了 Firefox 的行为。

我在 Chrome 和 Firefox 中测试了以下代码,并惊讶地发现 Firefox 似乎认为它们是可迭代的,但 Chrome 却不然。此外,Firefox 认为 HTMLCollectionNodeList 返回的迭代器是同一个。

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 中的实际文件/控制台中运行会产生不同的结果(特别是最后一个比较)。任何对这里这种奇怪行为的启发也将不胜感激。

最佳答案

Symbol.iterator 支持 NodeListHTMLCollectionDOMTokenListDOMSettableTokenList > 是 discussedaddedWHATWG's DOM spec去年。

关于javascript - HTMLCollection 和 NodeList 是可迭代的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32285937/

相关文章:

javascript - jquery 将数组插入数组并在发布数据中维护键(多维?)

javascript - 将调用放入队列并等待更新 React.js 中的状态

javascript - vue数据函数语法

javascript - 单击一个元素并将类添加到该元素到另一个节点列表中具有相同索引的不同元素

javascript - getElementByid 是否返回一个 NodeList?

javascript - 从主文档的 CSP 沙箱中排除 iframe

javascript - 我应该为 ECMAscript2015 使用 .es6 文件扩展名吗?

javascript - ES6 - 如何修改其他模块中的变量

java - 如何在java中获取XML文件中节点的完整路径?

javascript - contenteditable <div> 中插入符号位置处的 HTML 节点