Что выведет консоль в случае удаления элемента массива с помощью оператора 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 при копировании.

Итого

  1. Массив — объект, его индексы — свойства с именами "0", "1" и т.д.
  2. delete удаляет свойство объекта, в т.ч. элемент массива по индексу.
  3. delete не меняет длину массива — остаётся дырка (empty).
  4. console.log показывает [1, empty, 4] (или подобное) для разреженного массива.
  5. splice — для удаления с переиндексацией, delete — для удаления элемента без сдвига.
  6. Разреженные массивы могут вести себя нестандартно в циклах и методах перебора.