使用' for ... of'时,Edge 15会抛出错误在NodeList

时间:2017-11-14 13:41:44

标签: javascript ecmascript-6 microsoft-edge nodelist

查看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;
&#13;
&#13;

适用于Chrome和Firefox,但不适用于Edge。相反它说:

  

对象不支持属性或方法&#39; Symbol.iterator&#39;。

据我了解,NodeList实际应该支持它,对吗?

这是一个自己尝试的fildde:Test it online

有人可以在这里解释问题或错误吗?

2 个答案:

答案 0 :(得分:6)

Edge确实支持for... of

它似乎不支持NodeLists上的迭代器。并非所有类似数组的对象都支持迭代器,我不确定NodeLists是否有任何标准说法。

无论如何,让for ... of与他们合作非常容易:

&#13;
&#13;
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;
&#13;
&#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没有实现任何这些。