查看ECMAScript compatibility table时,它表示Edge 15和Edge 16支持for ... of
循环。
但是,当我运行此代码时:
const list = document.querySelectorAll('[data-test]');
console.log(list);
for (const item of list) {
console.log(item);
}

<div data-test></div>
<div data-test></div>
<div data-test></div>
<div data-test></div>
<div data-test></div>
&#13;
适用于Chrome和Firefox,但不适用于Edge。相反它说:
对象不支持属性或方法&#39; Symbol.iterator&#39;。
据我了解,NodeList
实际应该支持它,对吗?
这是一个自己尝试的fildde:Test it online
有人可以在这里解释问题或错误吗?
答案 0 :(得分:6)
Edge确实支持for... of
。
它似乎不支持NodeLists上的迭代器。并非所有类似数组的对象都支持迭代器,我不确定NodeLists是否有任何标准说法。
无论如何,让for ... of
与他们合作非常容易:
const list = document.querySelectorAll('[data-test]');
for (const item of Array.from(list)) {
console.log(item);
}
&#13;
<div data-test>a</div>
<div data-test>b</div>
<div data-test>c</div>
<div data-test>d</div>
<div data-test>e</div>
&#13;
答案 1 :(得分:3)
如果支持for..of
但Edge 15忘记将行为添加到NodeList,您可以使用非常少的代码自行填充:
NodeList.prototype[Symbol.iterator] = function* () {
for(var i = 0; i < this.length ; i++) {
yield this[i]
}
}
要回答另一个问题(它是否在规范中定义为可迭代?),答案是是:
DOM规范defines NodeList为:
interface NodeList {
getter Node? item(unsigned long index);
readonly attribute unsigned long length;
iterable<Node>;
};
请注意第三个属性iterable<Node>;
。查找in the WebIDL spec:
在ECMAScript语言绑定中,可迭代的接口将是 有“条目”,“forEach”,“keys”,“values”和@@ iterator属性 在它的接口原型对象上。
似乎Edge没有实现任何这些。