一尘不染

为什么节点列表没有forEach?

javascript

我当时正在编写一个简短的脚本来更改<abbr>元素的内部文本,但是发现它nodelist没有forEach方法。我知道那nodelist不是继承自Array,但似乎不是forEach一种有用的方法吗?是否有一个具体的实施问题,我不知道阻止添加的forEachnodelist

注意:我知道Dojo和jQuery forEach的节点列表都有某种形式。由于限制,我无法使用任何一个。


阅读 386

收藏
2020-05-01

共1个答案

一尘不染

现在,NodeList在所有主要浏览器中都具有forEach()

原始答案

这些答案都不能解释 为什么 NodeList不继承自Array,从而允许它拥有forEach其余所有内容。

答案在此es-discuss线程上找到。简而言之,它破坏了网络:

问题是代码错误地将instanceof假定为实例是与Array.prototype.concat结合使用的Array。

Google的Closure库中存在一个错误,由于该错误,几乎所有Google的应用程序都失败了。发现该库后立即对其进行了更新,但在那里可能仍然存在与concat结合使用时做出相同错误假设的代码。

也就是说,某些代码做了类似的事情

if (x instanceof Array) {
  otherArray.concat(x);
} else {
  doSomethingElseWith(x);
}

但是,concat将“实际”数组(不是Instanceof数组)与其他对象区别对待:

[1, 2, 3].concat([4, 5, 6]) // [1, 2, 3, 4, 5, 6]
[1, 2, 3].concat(4) // [1, 2, 3, 4]

因此,这意味着上面的代码在x是NodeList的时候就中断了,因为在它沿着doSomethingElseWith(x)路径行进之前,而之后沿着otherArray.concat(x)路径行进,由于x不是真正的数组,所以这样做很奇怪。

一段时间以来,有人提出了一个Elements类的建议,该类是Array的真正子类,将被用作“新的NodeList”。但是,至少从现在起,它已从DOM标准中删除,因为由于各种技术和规范相关的原因,尚不可行。

2020-05-01