为什么Array.forEach比Javascript中的for()循环慢?

时间:2017-05-06 14:43:04

标签: javascript arrays performance foreach

任何人都可以告诉我,在javascript中,array.forEach比循环慢的原因是什么。有什么特别的原因。

这是我试图找到性能的代码。

// Populate the base array
    var arr = [];
    for (var i = 0; i < 1000; i++) {
      arr[i] = i;
    }

    function someFn(i) {
      return i * 3 * 8;
    }

使用Array.forEach:

arr.forEach(function (item){
  someFn(item);
})

使用for循环:

for (var i = 0, len = arr.length; i < len; i++) {
  someFn(arr[i]);
}

我在测试跑步者上测试过它。结果如下: enter image description here

正如您所看到的,Array.ForEach比for循环慢96%。 提前致谢。

1 个答案:

答案 0 :(得分:8)

根据@BenAston&amp;的反馈更新@trincot

粗略地说,这就是两种情况下发生的情况:

For loop

  1. 将索引变量设置为初始值
  2. 检查是否退出循环
  3. 运行循环体
  4. 增加索引变量
  5. 返回第2步
  6. 每次迭代发生的唯一开销是检查&amp;增量,这是非常低负荷的操作。

    forEach loop

    1. 实例化回调函数
    2. 检查是否有下一个要处理的元素
    3. 使用新的执行上下文(包括函数的“范围”)调用下一个要处理的元素的回调;因此它的上下文,参数,内部变量和对任何外部变量的引用(如果使用的话)< / LI>
    4. 运行回调内容
    5. 拆除回调函数调用
    6. 返回第2步
    7. 功能设置的开销&amp;拆除步骤3&amp;这里的5比增量和增量大得多。检查vanilla for-loop的整数。

      也就是说,许多现代浏览器认识到&amp;优化forEach调用,in some cases,forEach甚至可能更快!