DOM4使NodeList可迭代:
interface NodeList { getter Node? item(unsigned long index); readonly attribute unsigned long length; iterable; };
根据WebIDL,这意味着
实现被声明为可迭代的接口的对象被迭代以获得一系列值.
注意:在ECMAScript语言绑定中,可迭代的接口将在其接口原型对象上具有"entries","forEach","keys","values"和 @@ iterator属性.
所以以下是可能的:
for (var el of document.querySelectorAll(selector)) ...
我注意到在Firefox和Chrome上同样适用于HTMLCollections:
for (var el of document.getElementsByTagName(tag)) ...
事实上,我得到了
HTMLCollection.prototype[Symbol.iterator] === [][Symbol.iterator]; // true
但是,HTMLCollection未定义为可迭代:
interface HTMLCollection { readonly attribute unsigned long length; getter Element? item(unsigned long index); getter Element? namedItem(DOMString name); };
我还检查了WHATWG DOM规范,它也不能迭代.
那么,这种行为标准与否?是HTMLCollection
应该有一个@@iterator
原型?
我找到了,这在WebIDL中有解释:
如果接口有任何以下内容:
一个 迭代声明
一个索引属性吸气剂和整数类型的 属性为“长度”
一个maplike声明
一个setlike声明
那么必须存在一个名称为@@ iterator符号的属性,其属性为{[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:true },其值是一个函数对象。[...]
如果接口定义了索引属性getter,则 Function对象为%ArrayProto_values%。
在这种情况下,HTMLCollections具有一个索引属性getter:
getter Element? item(unsigned long index);
以及一个名为“ length”的整数类型的属性:
readonly attribute unsigned long length;
因此,是的,它应该可以工作。事实上,它也将用于的NodeLists工作,即使他们没有申报为迭代,但他们不会有entries
,forEach
,keys
和values
属性。正如@lonesomeday提到的那样,很可能HTMLCollection没有被定义为可迭代的,因为添加这些方法将不会向后兼容,因为namedItem
getter可以接受任意字符串。