节点列表上的javascript forEach

时间:2016-05-30 20:50:14

标签: javascript foreach

请考虑以下代码:

var els = document.querySelectorAll('.myClassName');

Array.prototype.forEach.call(els, function(el) {
  console.log(el.id);
});

var els包含一个nodelist,它不是一个数组,而forEach只适用于数组吗? 以上代码实际上是黑客吗?

1 个答案:

答案 0 :(得分:4)

  

...而forEach仅适用于数组吗?

不。 Array.prototype.forEach 故意通用,它可以应用于 array-like 的任何对象。来自the spec

  

注2:forEach函数是故意通用的;它不要求它的这个值是一个Array对象。因此,它可以转移到其他类型的对象用作方法。

规范清楚地列出了在处理forEach期间将使用哪些属性和/或方法;只要在调用期间通过this引用的对象具有这些对象,就可以在该对象上使用forEach。这就是使用forEach.call之类的原因:函数对象上的call方法(forEach是一个函数对象)使用你给call的第一个参数调用函数{{ 1}}在调用期间,并传递以下参数作为原始函数的参数。因此this调用Array.prototype.forEach.call(x, y)forEach设置为this,第一个参数设置为xy并不关心forEach的类型,只是它具有规范的算法中描述的相关属性和方法。

大多数this方法都是这样的,其他标准原型确实很多。

附注:Array.prototype返回的NodeList最近在现代浏览器上变为 iterable ,这意味着:1。它适用于ES2015 +的querySelectorAll和2它现在原生for-of。 (在现代浏览器上。)