У массивов в JavaScript незаданные свойства могут появляться по следующим причинам:
Разреженность массива (Sparse Arrays): Массив может быть создан с пропущенными элементами. Например, при присваивании значения по индексу, превышающему текущую длину массива, JavaScript расширит массив, оставив промежуточные элементы незаданными.
javascript
delete оператор: Использование оператора delete для удаления элемента массива оставляет "дыру" в массиве, делая элемент по этому индексу незаданным, но не сокращая длину массива.
javascript
Конструктор Array() с одним числовым аргументом: Создание массива с помощью new Array(length) или Array(length), где length - положительное целое число, создает массив указанной длины, но с незаданными элементами.
javascript
Некоторые методы массива: Некоторые методы массива, такие как splice(), могут удалять элементы, создавая тем самым незаданные места, если не вставляются новые элементы на их место или на их место смещаются другие элементы. Однако splice() обычно сдвигает элементы, чтобы заполнить пробелы. Более показательным примером может быть ручное присваивание undefined.
javascript
Пример undefined - это не "незаданное свойство" в том же смысле, что "дыра" от delete или создания разреженного массива. При итерации по массиву с "дырами", эти элементы пропускаются или имеют значение undefined в зависимости от метода итерации.
| Способ создания | Результат в массиве | Длина массива | Восприятие при итерации (например, for...of) |
|---|---|---|---|
| Разреженный массив | Пропуск элемента | Сохраняется (на основе наибольшего индекса) | Элемент пропускается |
delete оператор | Пропуск элемента | Сохраняется | Элемент пропускается |
new Array(length) | Пропуск элементов | length | Элементы пропускаются |
Явное присваивание undefined | Значение undefined | Сохраняется | Элемент обрабатывается со значением undefined |
Важно понимать разницу между элементом, имеющим значение undefined, и "дырой" в массиве. Итерационные методы, такие как forEach, map, filter, обычно пропускают "дыры", тогда как цикл for с числовым индексом или for...in обрабатывает их по-разному (например, for...in итерирует по собственным перечисляемым свойствам, включая те, которые созданы вручную, но может не итерировать по "дырам").