【问题标题】:Speed of [].forEach.call(...?[].forEach.call(...?
【发布时间】:2012-12-13 21:02:00
【问题描述】:

我非常喜欢在 nodeLists 上使用 forEach 方法,如下所示:

var nodes = document.querySelectorAll(".foo");

[].forEach.call(nodes, function (item) {
    //do stuff with item
});

我想知道,这样做会比常规方式花费更长的时间吗? 例如

for(var i=0;i<nodes.length;i++){
    //do stuff with nodes[i];
}

【问题讨论】:

  • 顺便说一句 for(var i=0, el; el = nodes[i]; i++) 也可以 :)
  • 您是否有想要解决的特定性能案例?否则,您可能会避免过早优化。

标签: javascript foreach call nodelist


【解决方案1】:

这是nice performance comparison。据它说,Array.forEach 比原生的 for 循环慢。

【讨论】:

  • 干杯,感谢您的链接。这正是我所追求的。顺便说一句,jQuery.each 的速度有点令人惊讶。
【解决方案2】:

我知道这是一篇旧帖子,但使用 forEach 方法也可以通过窃取 Array 原型来完成。

NodeList.prototype.forEach = Array.prototype.forEach;

【讨论】:

  • +1 这样做一次,然后使用 someNodeList.forEach() 看起来比在每个循环中使用 .call() 或使用巨大的 ES3 风格的“for”循环要简洁得多
  • the ES5 spec 表示“forEach 函数是否可以成功应用于主机对象 [如 NodeList] 取决于实现。”据我所知,Chrome 和 Firefox 在主机对象上支持 forEach。 IE、Safari、Opera等我不知道
  • 它是依赖于实现的,但这不会对已经这样做的浏览器上的实现产生任何影响(我实际上还没有找到,不过会尝试 Chrome。)
【解决方案3】:

这取决于浏览器。别忘了 while(),它是 Firefox 4 上最快的。Here's a comparison

另外请记住,如果您支持不支持 forEach 的旧版浏览器,则需要将花费的时间添加到 implement a polyfill

【讨论】:

    猜你喜欢
    • 2013-06-27
    • 2013-04-09
    • 2016-09-24
    相关资源
    最近更新 更多