Image

forEach vs. for


Необходимость пройтись по массиву возникает довольно часто. Как это сделать наиболее быстро?

// Нервным поборникам красивого кода дальше лучше не читать ;)



Код



Для forEach:


arr.forEach(function (item) {

  var res = " " + item + " ";

});




В случае, если браузер не поддерживает forEach, в игру вступает:

if (!Array.prototype.forEach) {

   Array.prototype.forEach = function (callback, thisObject) {

      thisObject = thisObject || window;

      for (var index = 0, length = this.length; index < length; index++) {

         callback.apply(thisObject, [this[index], index, this]);

      }

   }

}


Для for:


for (var j = 0, l = arr.length; j < l; j++) {

  var res = " " + arr[j] + " ";

}

Кроме того, проверим метод each, которым библиотека prototype расширяет Array:


arr.each(function (item) {

  var res = " " + item + " ";

});


Тестируем


Метод замера времени


Выполним приведенный выше код 5000 раз для массива из 40 элементов.


Результаты:

Время приведено в миллисекундах.


Firefox 2.0.0.9:
Array.prototype.forEach 906
Prototype::each 1422
for 609



IExplorer 6.0:
Array.prototype.forEach 1641
Prototype::each 1843
for 750



Opera 9.24:
Array.prototype.forEach 515
Prototype::each 453
for 188

Делаем выводы



Если у вас много проходов по массивам и очень жесткие рамки по скорости выполнения, вспомните про старый добрый for ;)