Вебсправочник
Ваш первый сайт

Урок: пропущенная позиция массива и undefined

Разреженный массив может иметь длину больше числа реально существующих индексных свойств. Пропуск позиции отличается от явно записанного undefined, хотя обычное чтение может выглядеть одинаково.

Назначение

Разреженный массив может иметь длину больше числа реально существующих индексных свойств. Пропуск позиции отличается от явно записанного undefined, хотя обычное чтение может выглядеть одинаково.

Как это работает

Пример сравнивает два массива одинаковой длины. Object.hasOwn проверяет наличие индекса, а forEach показывает, какие позиции действительно посещаются. Запускайте код в собственном учебном файле.

Пример

const sparse = new Array(2);
const explicit = [undefined, undefined];
console.log(sparse.length, explicit.length);
console.log(Object.hasOwn(sparse, 0), Object.hasOwn(explicit, 0));
const visited = [];
sparse.forEach((value, index) => visited.push(index));
console.log(visited);
console.log([...sparse]);

Что должно получиться

Оба массива имеют длину 2, но нулевой индекс существует только у explicit. ForEach не посещает пустые позиции sparse, а разворачивание через итератор даёт значения undefined.

Граница применения и частая ошибка

Разные методы массивов по-разному обрабатывают пропуски; не переносите вывод о forEach на все операции. Delete по индексу оставляет дыру и не сокращает length. Для обычного удаления со сдвигом рассмотрите splice или создание новой коллекции.

Самостоятельная проверка

Заполните один индекс sparse и повторите обход. Затем сравните delete и splice на копиях. Объясните, почему проверка value === undefined не отличает все случаи отсутствия элемента.

Самостоятельный учебный материал. Техническая документация: первоисточник по теме ↗. Если результат отличается, проверьте код и версию браузера.