delete
Оператор delete
усуває властивість з об'єкта. Якщо значення властивості саме є об'єктом і на цей об'єкт більше немає посилань, то об'єкт з цієї властивості, врешті-решт, автоматично звільняється.
Спробуйте його в дії
Синтаксис
delete object.property
delete object[property]
[!NOTE] Синтаксис мови дозволяє ставити після оператора
delete
широке розмаїття виразів, але лише форми, показані вище, дадуть змістовний результат.
Параметри
object
Ім'я об'єкта, або ж вираз, котрий в результаті дає об'єкт.
property
Властивість до видалення.
Повернене значення
Завжди true
, окрім випадків, коли властивість є власною та неналаштовною – тоді, якщо виконання відбувається не в суворому режимі, буде повернено false
.
Винятки
TypeError
Викидається в суворому режимі, якщо властивість є власною та неналаштовною.
ReferenceError
Викидається, якщо
object
– цеsuper
.
Опис
Оператор delete
має такий само пріоритет, як інші унарні оператори, як то typeof
. Таким чином, він приймає будь-які вирази, сформовані операторами вищого пріоритету. Проте форми, показані нижче, в суворому режимі зразу призведуть до синтаксичних помилок:
delete identifier;
delete object.#privateProperty;
Завдяки тому, що класи автоматично отримують суворий режим, а приватні властивості можна правомірно використовувати лише в тілах класів, приватні властивості ніколи не можуть бути видалені. Попри те, що delete identifier
може спрацювати, якщо identifier
вказує на налаштовну властивість глобального об'єкта, цієї форми слід уникати, ставлячи натомість перед ідентифікатором globalThis
.
Попри те, що інакші вирази – приймаються, вони не дають змістовних результатів:
delete console.log(1);
// Виводить 1, повертає true, але нічого не видалено
Оператор delete
прибирає з об'єкта задану властивість. У випадку успішного видалення – повертає true
, інакше – false
. Всупереч поширеному уявленню (мабуть, пов'язаному з іншими мовами програмування, як то delete у C++), оператор delete
не має стосунку до безпосереднього звільнення пам'яті. Керування пам'яттю виконується в непрямий спосіб, шляхом розриву посилань. Дивіться подробиці на сторінці керування пам'яттю.
Важливо враховувати наступні варіанти:
- Якщо властивість, що видаляється, не існує,
delete
нічого не зробить і повернеtrue
. delete
діє лише на власні властивості. Якщо властивість з ідентичним іменем існує в ланцюжку прототипів об'єкта, то після видалення власної властивості об'єкт використовуватиме властивість з ланцюжка прототипів.- Неналаштовні властивості не можуть бути прибрані. Серед них – властивості вбудованих об'єктів, як то
Math
,Array
,Object
, а також властивості, створені як неналаштовні за допомогою методів штибуObject.defineProperty()
. - Видалення змінних, включно з параметрами функцій, ніколи не спрацює.
delete variable
в суворому режимі викинеSyntaxError
, а в несуворому – ніяк не подіє.- Змінні, оголошені за допомогою
var
, не можуть бути видалені з глобальної області видимості, чи області функції, адже хоч вони могли бути прикріплені до глобального об'єкта, та не є налаштовними. - Змінні, оголошені за допомогою
let
абоconst
, не можуть бути видалені з області видимості, у котрій були визначені, адже не є прикріпленими до об'єкта.
- Змінні, оголошені за допомогою
Приклади
Застосування delete
[!NOTE] Наступний приклад використовує можливості, доступні лише в нестрогому режимі, але заборонені в строгому, як то неявне створення глобальних змінних та видалення ідентифікаторів.
// Створення в глобальній області видимості властивості empCount.
// Оскільки використовується var, вона буде позначена як неналаштовна.
var empCount = 43;
// Створення в глобальній видимості властивості EmployeeDetails.
// Оскільки var не використовується, вона буде позначена як налаштовна.
EmployeeDetails = {
name: "xyz",
age: 5,
designation: "Developer",
};
// delete може застосовуватися для усунення з об'єктів їх властивостей.
delete EmployeeDetails.name; // повертає true
// Навіть коли властивість не існує, delete повертає "true".
delete EmployeeDetails.salary; // повертає true
// EmployeeDetails – властивість глобальної області видимості.
delete EmployeeDetails; // повертає true
// Натомість empCount – не налаштовна властивість,
// адже при її створенні використано var.
delete empCount; // повертає false
// Крім цього, delete не діє на вбудовані статичні властивості,
// котрі є неналаштовними.
delete Math.PI; // повертає false
function f() {
var z = 44;
// delete не діє на імена локальних змінних
delete z; // повертає false
}
delete і ланцюжок прототипів
В наступному прикладі видаляється власна властивість об'єкта, коли властивість з ідентичним іменем доступна в ланцюжку прототипів:
function Foo() {
this.bar = 10;
}
Foo.prototype.bar = 42;
const foo = new Foo();
// foo.bar пов'язано з
// власною властивістю.
console.log(foo.bar); // 10
// Видалити власну властивість всередині
// об'єкта foo.
delete foo.bar; // повертає true
// foo.bar досі доступна в
// ланцюжку прототипів
console.log(foo.bar); // 42
// Видалити властивість у прототипі.
delete Foo.prototype.bar; // повертає true
// Властивість "bar" більше не може бути
// успадкована від Foo, оскільки була
// видалена.
console.log(foo.bar); // undefined
Видалення елементів масиву
Коли видаляється елемент масиву, на його length
це не впливає. Довжина зберігається, навіть якщо видалити останній елемент масиву.
Коли оператор delete
усуває елемент масиву, цей елемент зникає з масиву. В наступному прикладі за допомогою delete
видаляється trees[3]
.
const trees = ["секвоя", "лавр", "кедр", "дуб", "клен"];
delete trees[3];
console.log(3 in trees); // false
Так утворюється розріджений масив з порожньою коміркою. Якщо треба, аби елемент масиву був, але мав значення undefined
, слід його присвоїти, а не використовувати оператор delete
. В наступному прикладі trees[3]
присвоюється undefined
, але елемент масиву далі існує:
const trees = ["секвоя", "лавр", "кедр", "дуб", "клен"];
trees[3] = undefined;
console.log(3 in trees); // true
Якщо ж натомість треба прибрати елемент масиву, змінивши вміст масиву, слід використати метод splice()
. У наступному прикладі trees[3]
цілком усувається з масиву за допомогою splice()
:
const trees = ["секвоя", "лавр", "кедр", "дуб", "клен"];
trees.splice(3, 1);
console.log(trees); // ["секвоя", "лавр", "кедр", "клен"]
Видалення неналаштовних властивостей
Коли властивість позначена як неналаштовна, delete
не дасть жодного ефекту і поверне false
. У суворому режимі така дія викине помилку TypeError
.
const Employee = {};
Object.defineProperty(Employee, "name", { configurable: false });
console.log(delete Employee.name); // повертає false
var
створює неналаштовні властивості, котрі не можна видалити оператором delete
:
// Оскільки "nameOther" додано за допомогою
// ключового слова var, вона позначена як неналаштовна
var nameOther = "XYZ";
// До цієї глобальної властивості можна звернутися за допомогою:
Object.getOwnPropertyDescriptor(globalThis, "nameOther");
// {
// value: "XYZ",
// writable: true,
// enumerable: true,
// configurable: false
// }
delete globalThis.nameOther; // повертає false
В суворому режимі це спричинить виняток.
Видалення глобальних властивостей
Якщо глобальна властивість є налаштовною (наприклад, створена безпосереднім присвоєнням властивості), то вона може бути видалена, і подальші звертання до неї як до глобальної змінної спричинять ReferenceError
.
globalThis.globalVar = 1;
console.log(globalVar); // 1
// В несуворому режимі також можна застосувати `delete globalVar`
delete globalThis.globalVar;
console.log(globalVar); // ReferenceError: globalVar is not defined
Специфікації
Сумісність із браузерами
desktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
delete
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 4 | Opera Full support 9 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |