|
1 |
| -## Итерации по массивам и свойства |
| 1 | +## Перебор массивов и свойств объектов |
2 | 2 |
|
3 |
| -Несмотря на то, что массивы в JavaScript являются объектами, нет достаточных оснований для использования [цикла `for in`](#object.forinloop) для итерации по элементам массива. Фактически, существует несколько весомых причин **против** использования `for in` в массивах. |
| 3 | +Несмотря на то, что массивы в JavaScript являются объектами, достаточных оснований использовать [цикл `for in`](#object.forinloop) для перебора элементов массива **не существует**. Наоборот, существует достаточно хороших причин **против** использования `for in` с массивами. |
4 | 4 |
|
5 |
| -> **Замечание:** Массивы в JavaScript **не** являются *ассоциативными массивами*. Для связывания ключей и значений в JavaScript есть только [объекты](#object.general). И при том, что ассоциативные массивы **сохраняют** заданный порядок, объекты **не** делают этого. |
| 5 | +> **Замечание:** Массивы в JavaScript **не** являются *ассоциативными массивами*. Для связывания ключей и значений в JavaScript есть только [объекты](#object.general). При этом, ассоциативные массивы априори **сохраняют** заданный порядок свойств, объекты же **не** делают этого. |
6 | 6 |
|
7 |
| -Во время выполнения `for in` циклически перебираются все свойства объекта, находящиеся в цепочке прототипов. Единственный способ исключить ненужные свойства — использовать [`hasOwnProperty`](#object.hasownproperty), а это **до 20 раз** медленнее обычного цикла `for`. |
| 7 | +Поскольку во время выполнения `for in` циклически перебираются все свойства объекта, находящиеся в его цепочке прототипов, а единственный способ исключить ненужные свойства — использовать [`hasOwnProperty`](#object.hasownproperty) — такой цикл **до 20 раз** медленнее обычного цикла `for`. |
8 | 8 |
|
9 | 9 | ### Итерирование
|
10 | 10 |
|
11 |
| -Для достижения лучшей производительности при итерации по массивам, лучше всего использовать обычный цикл `for`. |
| 11 | +Для достижения лучшей производительности при переборе массивов, лучше всего использовать обычный цикл `for`. |
12 | 12 |
|
13 | 13 | var list = [1, 2, 3, 4, 5, ...... 100000000];
|
14 | 14 | for(var i = 0, l = list.length; i < l; i++) {
|
|
17 | 17 |
|
18 | 18 | В примере выше есть один дополнительный приём, с помощью которого кэшируется величина длины массива: `l = list.length`.
|
19 | 19 |
|
20 |
| -Несмотря на то, что свойство `length` определено в самом массиве, поиск этого свойства накладывает дополнительные расходы на каждой итерации цикла. Пусть в этом случае новые движки JavaScript теоретически **могут** применить оптимизацию, но нет никакого способа узнать, будет оптимизирован код на новом движке или нет. |
| 20 | +Несмотря на то, что свойство `length` определено в самом массиве, поиск этого свойства в объекте накладывает дополнительные расходы на каждой итерации цикла. Пусть в этом случае новые движки JavaScript и **могут** теоретически применить оптимизацию, всё же нет способа точно предугадать, будет оптимизирован код на новом движке или нет. |
21 | 21 |
|
22 |
| -Фактически, отсутствие кэширования может привести к выполнению цикла в **два раза медленнее**, чем при кэшировании длины |
| 22 | +Фактически, цикл без кэширования может выполняться в **два раза медленнее**, нежели цикл с кэшированной длиной. |
| 23 | + |
| 24 | +''Прим. перев.'' — если вам нужно перебрать элементы в обратном порядке или порядок не имеет для вас значения, есть дополнительный способ (не самый быстрый, поскольку происходит сравнение без приведения типов) перебрать элементы массива: `var i = arr.length; while (i--) { ... }`. |
23 | 25 |
|
24 | 26 | ### Свойство `length`
|
25 | 27 |
|
26 |
| -Хотя *геттер* свойства `length` просто возвращает количество элементов содежащихся в массиве, *сеттер* можно использовать для **обрезания** массива. |
| 28 | +Хотя *геттер* свойства `length` всего лишь возвращает количество элементов содержащихся в массиве, *сеттер* оказывается удобно использовать для **урезания** массивов. |
27 | 29 |
|
28 | 30 | var foo = [1, 2, 3, 4, 5, 6];
|
29 | 31 | foo.length = 3;
|
|
32 | 34 | foo.length = 6;
|
33 | 35 | foo; // [1, 2, 3]
|
34 | 36 |
|
35 |
| -Присвоение свойству `length` меньшей величины урезает массив, однако присвоение большего значения не даст никакого эффекта. |
| 37 | +Присвоение свойству `length` меньшей величины урезает массив, однако присвоение большего значения не даёт никакого эффекта. |
36 | 38 |
|
37 | 39 | ### Заключение
|
38 | 40 |
|
39 |
| -Для оптимальной работы кода рекомендуется всегда использовать простой цикл `for` и кэшировать свойство `length`. Использование `for in` с массивами является признаком плохого кода, обладающего предпосылками к ошибкам и может привести к низкой скорости его выполнения. |
| 41 | +Для оптимальной работы кода рекомендуется всегда использовать простой цикл `for` и кэшировать свойство `length`. Использование `for in` с массивами является признаком плохого кода, содержащего потенциальные ошибки, а также приводит к низкой скорости его выполнения. |
40 | 42 |
|
0 commit comments