Несмотря на то, что массивы в JavaScript являются объектами, нельзя найти весомых аргументов использовать цикл for in для перебора элементов массива. Наоборот, есть множество убедительных причин против использования циклов for in при переборе массивов.
Замечание: Массивы в JavaScript не являются ассоциативными массивами. Для группировки ключей и значений по парам в JavaScript есть только объекты. При этом, ассоциативные массивы по определению сохраняют заданный порядок свойств, объекты JavaScript этого не делают.
Поскольку во время выполнения for in циклически перебираются все свойства объекта, находящиеся в его цепочке прототипов, а единственный способ исключить ненужные свойства — использовать hasOwnProperty — в действии такой цикл до 20 раз медленнее обычного цикла for.
Наилучшей производительности при переборе массивов можно достичь используя обычный цикл for.
var list = [1, 2, 3, 4, 5, ...... 100000000];
for(var i = 0, l = list.length; i < l; i++) {
console.log(list[i]);
}
В примере выше есть один дополнительный приём, которым кэшируется длина массива: l = list.length.
Несмотря на то, что свойство length определено в самом массиве, поиск этого свойства в прототипе объекта накладывает дополнительные расходы на каждую итерацию цикла. Да, в этом случае современные движки JavaScript и теоретически могут применить оптимизацию, но нет способа предугадать наверняка, будет ли оптимизирован код на используемом движке, или нет.
Фактически, цикл без кэширования может выполняться в два раза медленнее, нежели цикл с закэшированной длиной.
Хотя геттер свойства length просто возвращает количество элементов содержащихся в массиве, его сеттер можно использовать для обрезания массива.
var foo = [1, 2, 3, 4, 5, 6];
foo.length = 3;
foo; // [1, 2, 3]
foo.length = 6;
foo; // [1, 2, 3]
Присвоение свойству length величины, меньшей чем текущая его длина, урезает массив, однако присвоение большего значения не производит никакого эффекта.
Для оптимальной работы кода рекомендуется всегда использовать обычный цикл for и кэшировать свойство length. Использование for in с массивами является признаком плохого кода, содержащего потенциальные ошибки, а также приводит к низкой скорости его выполнения.