[]中forEach.call的速度是多少?

6

我非常喜欢在类似这样的节点列表上使用 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];
}

3
顺便提一句,for(var i=0, el; el = nodes[i]; i++) 也可以工作 :) - salmatron
你有特定的性能问题需要解决吗?否则,你可能要避免过早地进行优化。 - mikemaccana
3个回答

7

这里有一个关于性能比较的不错的比较。根据它的说法,Array.forEach 比本地的 for 循环更慢。


谢谢你提供的链接,正是我需要的。 顺便说一句,jQuery.each的速度有点令人惊讶。 - Yansky

4

我知道这是个老帖子,但是通过窃取数组原型也可以使用forEach方法。

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

+1 这样做一次,然后使用 someNodeList.forEach() 看起来比每个循环都使用 .call() 或使用巨大的 ES3 风格的 'for' 循环更整洁。 - mikemaccana
1
但是ES5规范指出,“无论forEach函数是否能够成功应用于主机对象[如NodeList],取决于实现。”据我所知,Chrome和Firefox支持在主机对象上使用forEach。至于IE、Safari、Opera等,我不清楚。 - Andres Riofrio
这取决于实现,但对已经完成的浏览器实现不会有任何影响(我还没有找到任何一个,不过会尝试 Chrome)。 - Dave Mackintosh

1

这取决于浏览器。不要忘记在Firefox 4上while()是最快的。这里有一个比较

还要记住,如果您支持不支持forEach的旧浏览器,则需要添加实现polyfill所需的时间。实现polyfill


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接