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

Nic*_*ght 5 javascript foreach angularjs

我刚刚查看了今年ng-europe会议上的一些照片,并注意到我认为可能会显示来自即将到来的Angular 2的一些代码.请看这里:

来自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).我能想象的唯一原因是性能影响.

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

dfs*_*fsq 8

有许多类似于Array的对象看起来像数组,但不是.举几个:

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

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

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

Array.prototype.join.call({0: 'one', 1: 'two', length: 2}, ' ');
Run Code Online (Sandbox Code Playgroud)

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