Оператор delete
Оператор delete у JavaScript видаляє властивості з об'єктів (або елементи з масивів). Він прибирає саму властивість, а не тільки її значення, і має кілька тонких нюансів: не зсуває елементи масиву, не чіпає прототип і не працює зі змінними.
Теорія
TL;DR
- Синтаксис:
delete object.propertyабоdelete object['property']. - Видаляє сам ключ: після
deleteвираз'key' in objдаєfalse. - Повертає
trueпри успіху іfalse, якщо властивість неконфігурована. - У масиві лишає «дірку»:
lengthне змінюється, елементи не зсуваються. - Не видаляє успадковані через прототип властивості, лише власні.
- Не працює зі змінними
var,let,const; у строгому режимі невдале видалення кидаєTypeError.
Швидкий приклад
const obj = { a: 1, b: 2 };
delete obj.a;
console.log(obj); // { b: 2 }
console.log('a' in obj); // falseСинтаксис і приклад з об'єктом
delete object.propertyабо
delete object['property']Приклад:
const user = {
name: 'Alice',
age: 25
};
delete user.age;
console.log(user); // { name: 'Alice' }
console.log('age' in user); // falseОператор
deleteвидаляє саму властивість з об'єкта, а не просто її значення.
Повернене значення
delete повертає логічне значення:
| Випадок | Повертає |
|---|---|
| Видалення пройшло успішно | true |
| Неможливо видалити (наприклад, властивість неконфігурована) | false |
Приклад:
const obj = {};
Object.defineProperty(obj, 'x', { value: 10, configurable: false });
console.log(delete obj.x); // false
console.log(obj.x); // 10Зверніть увагу: delete повертає true і тоді, коли такої властивості взагалі не було, бо після операції ключа в об'єкті точно немає.
Поведінка з масивами
const arr = [10, 20, 30];
delete arr[1];
console.log(arr); // [10, <1 empty item>, 30]
console.log(arr.length); // 3Важливо:
deleteне зсуває елементи масиву, він просто видаляє значення, лишаючи «дірку» (empty).
Якщо треба видалити елемент разом зі зміною довжини масиву, використовуйте методи:
arr.splice(1, 1); // видалить елемент і зсуне рештуРозріджений масив після delete поводиться нерівно: forEach, map і filter пропускають дірки, а for і for...of побачать undefined.
delete проти присвоєння undefined
Різниця між delete і присвоєнням undefined:
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 не чіпає властивості, успадковані через прототип:
const person = { name: 'Alex' };
const user = Object.create(person);
console.log('name' in user); // true
delete user.name; // не видалить з прототипу
console.log('name' in user); // trueВін видаляє лише власні властивості об'єкта.
Обмеження:
-
deleteне працює зі змінними, оголошеними черезvar,letабоconst:javascriptlet x = 10; console.log(delete x); // false console.log(x); // 10Видалити можна лише властивість об'єкта, а не змінну.
-
У строгому режимі (
"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.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.