Скорость [].forEach.call(?

Я большой поклонник использования метода 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];
}

person Yansky    schedule 23.02.2010    source источник
comment
Кстати for(var i=0, el; el = nodes[i]; i++) тоже работает :)   -  person Salman von Abbas    schedule 11.03.2012
comment
У вас есть конкретный случай производительности, который вы пытаетесь решить? В противном случае вы можете избежать преждевременной оптимизации.   -  person mikemaccana    schedule 29.01.2013


Ответы (3)


Вот хорошее сравнение производительности. Согласно ему Array.forEach медленнее родного цикла for.

person Darin Dimitrov    schedule 23.02.2010
comment
Cпасибо за ссылку. Это именно то, что я был после. Кстати, скорость jQuery.each немного удивляет. - person Yansky; 23.02.2010

Я знаю, что это старый пост, но с помощью метода forEach можно также украсть прототип Array.

NodeList.prototype.forEach = Array.prototype.forEach;
person Dave Mackintosh    schedule 13.12.2012
comment
+1 Если сделать это один раз, то someNodeList.forEach() будет выглядеть намного аккуратнее, чем использование .call() для каждого цикла или использование гигантских циклов for в стиле ES3. - person mikemaccana; 29.01.2013
comment
Но спецификация ES5 говорит, что можно ли успешно применить функцию forEach к хосту объект [например, NodeList] зависит от реализации. Насколько я знаю, Chrome и Firefox поддерживают forEach на хост-объектах. Не знаю про IE, Safari, Opera и т.д. - person Andres Riofrio; 29.05.2013
comment
Это зависит от реализации, но это не будет иметь никакого значения для реализации в браузерах, которые это сделали (на самом деле я еще не нашел их, хотя попробую Chrome). - person Dave Mackintosh; 29.05.2013

Это зависит от браузера. И не забывайте о методе while(), который является самым быстрым в Firefox 4. Вот сравнение.

Также имейте в виду, что если вы поддерживаете старые браузеры, которые не поддерживают forEach, вам нужно добавить время, необходимое для реализовать полифилл.

person craigpatik    schedule 13.04.2011