Javascript HTMLCollection和NodeList是可重用的吗?

Javascript HTMLCollection和NodeList是可重用的吗?,javascript,ecmascript-6,nodelist,htmlcollection,Javascript,Ecmascript 6,Nodelist,Htmlcollection,在ES6中,an是一个允许用于。。。的,并具有Symbol.iterator键 数组是可编辑的,集合和映射也是可编辑的。问题是:你是一个不可容忍的人吗?他们应该是吗 MDN文档似乎表明,NodeList是一个可移植的 for…of循环将在支持for…of的浏览器中正确循环NodeList对象(如Firefox 13及更高版本) 这似乎证实了Firefox的行为 我在Chrome和Firefox中测试了以下代码,惊讶地发现Firefox似乎认为它们是可移植的,但Chrome却没有。此外,Firef

在ES6中,an是一个允许
用于。。。的,并具有Symbol.iterator键

数组是可编辑的,集合和映射也是可编辑的。问题是:你是一个不可容忍的人吗?他们应该是吗

MDN文档似乎表明,
NodeList
是一个可移植的

for…of
循环将在支持
for…of
的浏览器中正确循环NodeList对象(如Firefox 13及更高版本)

这似乎证实了Firefox的行为

我在Chrome和Firefox中测试了以下代码,惊讶地发现Firefox似乎认为它们是可移植的,但Chrome却没有。此外,Firefox认为
HTMLCollection
NodeList
返回的迭代器是相同的

var col=document.getElementsByClassName('test');//应获得2个元素的HTMLCollection
var nod=document.querySelectorAll('.test');//应获得2个元素的节点列表
var arr=[].slice.call(col);//应该得到2个元素的数组
console.log(col[Symbol.iterator]);//Firefox:迭代器函数,Chrome:未定义
console.log(nod[Symbol.iterator]);//Firefox:迭代器函数,Chrome:未定义
console.log(arr[Symbol.iterator]);//Firefox和Chrome:迭代器函数
console.log(col[Symbol.iterator]==nod[Symbol.iterator]);//Firefox:没错
console.log(col[Symbol.iterator]==arr[Symbol.iterator]);//Firefox:false
1

2
符号。迭代器
节点列表
HTMLCollection
DOMTokenList
DOMSettableTokenList
的支持一直持续到去年。

不幸的是,现在还没有。但在它们完成之前,您可以像这样轻松地填充它们:

HTMLCollection.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
正如所指出的,2014年WHATWG的DOM规范中增加了对
节点列表的原生
Symbol.iterator
支持

不幸的是,Chrome51是第一个支持它的Chrome版本,在撰写本文时,它的Beta版才刚刚发布。此外,任何版本的Internet Explorer或Edge都不支持

要在所有浏览器中将
Symbol.iterator
NodeList
的支持添加到代码中,只需使用以下多边形填充:

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

对于尝试使用TypeScript在NodeList上迭代到这里的任何人。我在修复程序中发现了这个问题,这是您需要的
tsconfig.json

{
  "compilerOptions": {
    "lib": ["es2017", "dom", "dom.iterable"],
    "downlevelIteration": true
  }
}
我遇到的问题错误是:

Type 'NodeListOf<Element>' is not an array type.

在铬合金中,它不是一个可移植的,但它应该是。看,你可能想看看它在Safari中也不适合。从技术上讲,ES6和WHATWG是不同的委员会。ES6委员会认为WHATWG仅仅是ES5的起点,标准从此开始演变,从此忽略WHATWG。仍然有人是这两个委员会的成员,因此我希望在某个时候会向ES6委员会提出建议(尽管更可能向ES7提出建议,因为ES7处于草案模式,而ES6被认为是“最终的”)。从技术上讲,ES6和WHATWG都不是一个委员会。TC39是一个标准化ECMAScript的委员会。WHATWG是一个标准化相关课程的社区。TC39无意将这些类标准化。是的,这正是我现在为
HTMLCollection
NodeList
所做的。奇怪的是,Chrop/Opera不认为它们是可重复的,而Firefox则是这样。从目前为止的评论来看,我想应该是这样,但我不能100%肯定。
[...document.querySelectorAll('#md-view a')]