delete

Оператор delete усуває властивість з об'єкта. Якщо значення властивості саме є об'єктом і на цей об'єкт більше немає посилань, то об'єкт з цієї властивості, врешті-решт, автоматично звільняється.

Спробуйте його в дії

Синтаксис

delete object.property
delete object[property]

Примітка: Синтаксис мови дозволяє ставити після оператора 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

Примітка: Наступний приклад використовує можливості, доступні лише в нестрогому режимі, але заборонені в строгому, як то неявне створення глобальних змінних та видалення ідентифікаторів.

// Створення в глобальній області видимості властивості 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
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
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

Дивіться також