Skip to content

Latest commit

 

History

History
40 lines (23 loc) · 4.03 KB

File metadata and controls

40 lines (23 loc) · 4.03 KB

Перебор массивов и свойств объектов

Несмотря на то, что массивы в 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

Хотя геттер свойства 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 с массивами является признаком плохого кода, содержащего потенциальные ошибки, а также приводит к низкой скорости его выполнения.