理解[].forEach.call()并说明为什么要使用[].forEach.call()

[].forEach.call(elems, callback)

相当于:

Array.prototype.forEach.call(elems, callback)

又相当于:

function(elems, callback) {
  if([].forEach) {
    [].forEach.call(elems, callback);
  } else {
    for(var i = 0; i < elems.length; i++) {
      callback(elems[i], i);
    }
  }
}(elems, callback)

[] 就是个数组,而且是用不到的空数组,用来就是为了访问原生js中的数组相关方法。
但问题来了,elems的结构明明也可以正常使用forEach,为什么要用一个无用的[].forEach.call(elems, callback)而不直接使用elems.forEach( callback)?
这是因为,elems有时并不一定是一个严格意义上的数组,比如函数内实参类数组arguments,及DOM元素List,这些只是拥有类似于数组的数据结构,并不一定是数组。它们可以被遍历,但它们的原型并不是Array。故而,有时候会出现[].forEach.call(elems, callback)而不直接使用elems.forEach( callback)的情况。
但同样地,如果你明确你要遍历的数据结构的原型是Array,那么使用这种方式就会显得多余和混乱。会造成别人的困扰。

来源:

  1. 怎么理解空数组.forEach.call()?
  2. Array.prototype.slice.call()方法详解
posted @ 2023-01-02 10:54  方朝端  阅读(69)  评论(0编辑  收藏  举报

我的页脚HTML代码