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 ;)