Используйте 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.

В качестве примера проблем, которые могут возникнуть при использовании 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 добавил к объекту массива.