разница в производительности между циклами for и for .. in при итерации массива в JavaScript? - PullRequest
2 голосов
/ 10 марта 2012

Есть ли разница в производительности между

var a = [10,20,30,40];// Assume we have thousands of values here

// Approach 1
var i, len = a.length;
for(i=0;i<len;i++){
  alert(i);
  alert(a[i]);
}

// Approach 2   
for( i in a ){
  alert(i);
  alert(a[i]);
}

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

Используйте for (var i = 0, len = a.length; i < len; i++), потому что это намного быстрее, и это правильный путь или итерации элементов в массиве.

Первое: Неправильно повторять массивы с for (i in a), потому что эта итерация будет включать в себя перечисляемые свойства в дополнение к элементам массива. Если какие-либо методы или свойства были добавлены в массив, они будут частью итерации при использовании for (i in a), что никогда не будет тем, что вам нужно при попытке пройти элементы массива.

Секунда: Правильный вариант намного быстрее (в 9-20 раз быстрее). Посмотрите этот тест jsPerf, который показывает, что опция for (var i = 0; i < len; i++) в Chrome примерно в 9 раз быстрее, а разница в скорости в Firefox еще больше: http://jsperf.com/for-loop-comparison2.

enter image description here

В качестве примера проблем, которые могут возникнуть при использовании for (var i in a), когда я использую это, когда библиотека mootools включена в проект, я получаю все эти значения для i:

0
1
2
3
$family
$constructor
each
clone
clean
invoke
associate
link
contains
append
getLast
getRandom
include
combine
erase
empty
flatten
pick
hexToRgb
rgbToHex

, который выглядит как набор методов, которые mootools добавил к объекту массива.

0 голосов
/ 10 марта 2012

Я не знаю во всех браузерах, но в моем тесте с Firefox есть. for (i=0; etc...) намного быстрее. Вот пример jsfiddle, который показывает разницу. http://jsfiddle.net/pseudosavant/VyRH3/

Добавьте к этому проблемы, с которыми вы можете столкнуться с (for i in etc), когда объект Array был прототипом (возможно, в библиотеке), вы всегда должны использовать for (i=0; etc...) для зацикливания массивов.

(for i in etc) должен использоваться только для объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...