Что выведет консоль в случае удаления элемента массива с помощью оператора delete?
Дан код:
const c = [1, 2, 4];
delete c["1"];
console.log(c); // Первый
console.log(c.length); // Второй
Что выведетcя в console.log-ах?
Теория по задаче
Основные концепции, которые нужно знать
Массивы в JavaScript — это объекты
В JavaScript массивы — это частный случай объектов с числовыми ключами (индексами) и специальным свойством length.
Можно убедиться:
const arr = [10, 20];
console.log(typeof arr); // "object"
console.log(Array.isArray(arr)); // true
Оператор delete
delete — это оператор удаления свойства из объекта.
Работает так:
const obj = { a: 1, b: 2 };
delete obj.a;
console.log(obj.a); // undefined
console.log('a' in obj); // false
Важно: delete не меняет структуру объекта в плане сдвига остальных свойств, он просто удаляет указанное свойство.
Особенность delete при работе с массивами
Поскольку массив — объект, delete можно применять к его элементам (числовым свойствам).
Но delete не обновляет свойство length и не сдвигает индексы следующих элементов.
«Пустой слот» (hole) в массиве
После delete arr[index] на этом индексе образуется дырка (empty hole).
Массив становится разреженным (sparse array).
Проверка на наличие элемента:
const arr = [1, 2, 3];
delete arr[1];
console.log(arr.hasOwnProperty(1)); // false
Разница между delete и splice
delete— удаляет свойство, оставляет hole, длина не меняется.splice— изменяет массив, переиндексирует элементы, длина меняется.
const a = [1, 2, 3];
delete a[1];
// a = [1, empty, 3], length = 3
const b = [1, 2, 3];
b.splice(1, 1);
// b = [1, 3], length = 2
Чем опасны «дырки» в массивах?
Разреженные массивы могут вести себя неожиданно:
const arr = [1, 2, 3];
delete arr[1];
// Методы forEach, map, filter пропускают пустые слоты
arr.forEach((v, i) => console.log(i, v));
// Выведет: 0 1, 2 3 (пропустит индекс 1)
// for..in пройдёт только по существующим ключам
for (let i in arr) console.log(i); // 0, 2
// Array.from или spread заполняют дырки значением undefined
const newArr = Array.from(arr); // [1, undefined, 4]
const test = [1, , 4];
console.log([...test]); // [1, undefined, 4]
// empty заменяется на undefined при копировании.
Итого
- Массив — объект, его индексы — свойства с именами
"0","1"и т.д. deleteудаляет свойство объекта, в т.ч. элемент массива по индексу.deleteне меняет длину массива — остаётся дырка (empty).console.logпоказывает[1, empty, 4](или подобное) для разреженного массива.splice— для удаления с переиндексацией,delete— для удаления элемента без сдвига.- Разреженные массивы могут вести себя нестандартно в циклах и методах перебора.