Skip to main content

Оператор delete

Оператор delete у JavaScript видаляє властивості з об'єктів (або елементи з масивів). Він прибирає саму властивість, а не тільки її значення, і має кілька тонких нюансів: не зсуває елементи масиву, не чіпає прототип і не працює зі змінними.

Теорія

TL;DR

  • Синтаксис: delete object.property або delete object['property'].
  • Видаляє сам ключ: після delete вираз 'key' in obj дає false.
  • Повертає true при успіху і false, якщо властивість неконфігурована.
  • У масиві лишає «дірку»: length не змінюється, елементи не зсуваються.
  • Не видаляє успадковані через прототип властивості, лише власні.
  • Не працює зі змінними var, let, const; у строгому режимі невдале видалення кидає TypeError.

Швидкий приклад

javascript
const obj = { a: 1, b: 2 }; delete obj.a; console.log(obj); // { b: 2 } console.log('a' in obj); // false

Синтаксис і приклад з об'єктом

javascript
delete object.property

або

javascript
delete object['property']

Приклад:

javascript
const user = { name: 'Alice', age: 25 }; delete user.age; console.log(user); // { name: 'Alice' } console.log('age' in user); // false

Оператор delete видаляє саму властивість з об'єкта, а не просто її значення.

Повернене значення

delete повертає логічне значення:

ВипадокПовертає
Видалення пройшло успішноtrue
Неможливо видалити (наприклад, властивість неконфігурована)false

Приклад:

javascript
const obj = {}; Object.defineProperty(obj, 'x', { value: 10, configurable: false }); console.log(delete obj.x); // false console.log(obj.x); // 10

Зверніть увагу: delete повертає true і тоді, коли такої властивості взагалі не було, бо після операції ключа в об'єкті точно немає.

Поведінка з масивами

javascript
const arr = [10, 20, 30]; delete arr[1]; console.log(arr); // [10, <1 empty item>, 30] console.log(arr.length); // 3

Важливо: delete не зсуває елементи масиву, він просто видаляє значення, лишаючи «дірку» (empty).

Якщо треба видалити елемент разом зі зміною довжини масиву, використовуйте методи:

javascript
arr.splice(1, 1); // видалить елемент і зсуне решту

Розріджений масив після delete поводиться нерівно: forEach, map і filter пропускають дірки, а for і for...of побачать undefined.

delete проти присвоєння undefined

Різниця між delete і присвоєнням undefined:

javascript
const user = { name: 'Tim', age: 25 }; user.age = undefined; console.log(user); // { name: 'Tim', age: undefined } console.log('age' in user); // true (ключ лишився) delete user.age; console.log(user); // { name: 'Tim' } console.log('age' in user); // false (ключ видалено)

delete видаляє ключ повністю, а присвоєння undefined лише обнуляє значення. Це помітно у Object.keys(), JSON.stringify() і в циклі for...in.

Прототипи, обмеження та підсумок

delete не чіпає властивості, успадковані через прототип:

javascript
const person = { name: 'Alex' }; const user = Object.create(person); console.log('name' in user); // true delete user.name; // не видалить з прототипу console.log('name' in user); // true

Він видаляє лише власні властивості об'єкта.

Обмеження:

  1. delete не працює зі змінними, оголошеними через var, let або const:

    javascript
    let x = 10; console.log(delete x); // false console.log(x); // 10

    Видалити можна лише властивість об'єкта, а не змінну.

  2. У строгому режимі ("use strict") спроба видалити недопустиму властивість викличе помилку:

    javascript
    "use strict"; delete Object.prototype; // TypeError

Підсумкова таблиця:

ПитанняВідповідь
Що робитьВидаляє властивість з об'єкта
Працює зОб'єктами, масивами
Що повертаєtrue або false
Не працює дляЗмінних (var, let, const)
МасивиНе зсуває елементи, лишає «дірку»
Безпечно дляВласних властивостей об'єкта

Типові помилки

  • Використовувати delete для видалення елемента масиву. Довжина не зміниться, лишиться дірка; потрібні splice або filter.
  • Плутати delete obj.key з obj.key = undefined: у другому випадку ключ лишається і потрапляє в Object.keys().
  • Очікувати, що delete прибере успадковану властивість. Видаляти треба з того об'єкта, якому властивість належить.
  • Перевіряти результат delete як «чи існувала властивість»: для неіснуючого ключа він теж повертає true.
  • Забувати, що в строгому режимі невдале видалення кидає TypeError, а не мовчазне false.
  • Масово видаляти ключі в гарячому коді: це змінює приховані класи об'єкта і сповільнює його; часто краще створити новий об'єкт через деструктуризацію з rest.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.