为什么在array.forEach(cb)上使用Array.prototype.forEach.call(array,cb)?

时间:2014-10-24 10:41:57

标签: javascript angularjs foreach

我一直在查看今年欧洲会议的一些照片,并注意到我认为可能会显示即将推出的Angular 2中的一些代码。请看这里:

Example from ng-europe

(资料来源:https://plus.google.com/u/0/photos/+ThierryLAU/albums/6073085583895256529/6073092865671487010?pid=6073092865671487010&oid=105910465983441810901

我不能得到的是:

为什么此代码的作者使用Array.prototype.forEach.call(array, cb)优先于较短且(在我看来)等效版本array.forEach(cb)。我能想象的唯一原因是性能影响。

有人知道另一个区别吗?或者我对性能的猜测是对的吗?

2 个答案:

答案 0 :(得分:8)

有许多Array-like objects看起来像数组,但不是。说出一些:

  • arguments
  • childrenchildNodes个收藏品
  • document.getElementsByClassNamedocument.querySelectorAll
  • 等方法返回的NodeList集合
  • jQuery collections
  • 甚至是字符串。

许多数组原型方法都是通用的,这意味着它们的内部实现不依赖于上下文this作为Array构造函数的实例。这允许在其他对象的上下文中调用这些方法,其中"看起来"像数组一样。也就是说,看起来像一个数组意味着该对象具有数字键和长度属性。

以下是一个无用的示例,说明如何在类似自定义数组的对象上调用Array.prototype.join

Array.prototype.join.call({0: 'one', 1: 'two', length: 2}, ' ');

上面会输出字符串"one two"。但是提供的对象显然不是数组。

答案 1 :(得分:1)

element.attributeselement.children不是数组有点防御。