为什么原生javascript数组forEach方法明显慢于循环标准?

时间:2014-03-03 19:14:59

标签: javascript arrays performance foreach

在阅读Quintus game engine的源代码时,我发现他们大量使用for循环而不是原生forEach。

我原来的想法是原生的forEach方法比循环的标准稍快。然而,在用these benchmarks测试我的理论之后,for循环结构似乎明显更快。

在探索之后,我似乎无法找出引擎盖下发生的事情。有谁知道巨大差异的原因?

编辑:要清楚,我问这个案子是“为什么”。我不是在问“哪个更快”。

2 个答案:

答案 0 :(得分:17)

forEach在内部包含许多检查,并不像简单的循环那样简单 有关详细信息,请参阅the Mozilla Javascript reference

if (!Array.prototype.forEach)
{
  Array.prototype.forEach = function(fun /*, thisArg */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== "function")
      throw new TypeError();

    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++)
    {
      if (i in t)
        fun.call(thisArg, t[i], i, t);
    }
  };
}

答案 1 :(得分:0)

感谢粘贴实施;那里有答案: fun.callfun慢,i in t测试费用很高。

似乎已经非常努力地解决了不常见的案件 最终的结果对于普通用途来说太贵了。