--- title: Оператор delete slug: Web/JavaScript/Reference/Operators/delete tags: - JavaScript - Object - delete - Властивість - Оператор - керування пам'яттю translation_of: Web/JavaScript/Reference/Operators/delete ---
Оператор JavaScript delete
видаляє властивість об'єкта. Якщо на цю властивість більше немає посилань, пам'ять під неї зрештою звільняється автоматично.
delete вираз
де вираз має вертати посилання на властивість, наприклад:
delete object.property delete object['property']
object
property
Завжди true
, окрім випадків, коли властивість є особистою властивістю, недоступною для налаштування, в цьому випадку у нестрогому режимі повертається false
.
Викидає {{jsxref("TypeError")}} у строгому режимі, якщо властивість є особистою властивістю, недоступною для налаштування.
Попри розповсюджену думку, оператор delete
не має нічого спільного з прямим вивільненням пам'яті. Керування пам'яттю відбувається опосередковано через розривання посилань. Більше інформації дивіться у статті Керування пам'яттю.
Оператор delete
видаляє задану властивість з об'єкта. В разі успішного видалення, він поверне true
, інакше поверне false
. Однак, важливо враховувати наступні сценарії:
delete
не матиме жодного ефекту та поверне true
delete
має ефект лише для особистих властивостей).delete
не може видаляти функції у глобальній області видимості (незалежно від того, чи є вони оголошеннями функції, чи функціональними виразами).delete
.Наступний фрагмент надає простий приклад:
var Employee = { age: 28, name: 'абв', designation: 'розробник' } console.log(delete Employee.name); // вертає true console.log(delete Employee.age); // вертає true // При спробі видалити властивість, яка не існує, // повертається true console.log(delete Employee.salary); // вертає true
Коли властивість позначена як недоступна для налаштування, delete
не матиме жодного ефекту та поверне false
. У строгому режимі це спричинить помилку TypeError
.
var Employee = {}; Object.defineProperty(Employee, 'name', {configurable: false}); console.log(delete Employee.name); // вертає false
{{jsxref("Statements/var","var")}}, {{jsxref("Statements/let","let")}} та {{jsxref("Statements/const","const")}} створюють властивості, недоступні для налаштування, які не можуть бути видалені оператором delete
:
var nameOther = 'XYZ'; // Ми можемо звернутися до цієї глобальної властивості так: Object.getOwnPropertyDescriptor(window, 'nameOther'); // виведе: Object {value: "XYZ", // writable: true, // enumerable: true, // configurable: false} // Оскільки "nameOther" додана за допомогою ключового // слова var, вона позначена як недоступна для налаштування delete nameOther; // вертає false
У строгому режимі це спричинило б виняток.
У строгому режимі, якщо delete
використовується на прямому посиланні на змінну, аргумент функції чи ім'я функції, це викине {{jsxref("SyntaxError")}}.
Будь-яка змінна, оголошена через var
, позначається як недоступна для налаштування. У наступному прикладі змінна salary
недоступна для налаштування та не може бути видалена. У нестрогому режимі ця операція delete
поверне false
.
function Employee() { delete salary; var salary; } Employee();
Подивимось, як той самий код поводиться у строгому режимі. Замість того, щоб повернути false
, код викидає SyntaxError
.
"use strict"; function Employee() { delete salary; // SyntaxError var salary; } // Схожим чином, пряме звернення до фукнції // оператором delete викине SyntaxError function DemoFunction() { //якийсь код } delete DemoFunction; // SyntaxError
// Створює властивість adminName у глобальній області видимості. adminName = 'абв'; // Створює властивість empCount у глобальній області видимості. // Оскільки ми використовуємо var, вона недоступна для налаштування. Так само як з let та const. var empCount = 43; EmployeeDetails = { name: 'абв', age: 5, designation: 'Розробник' }; // adminName - властивість у глобальній області видимості. // Вона може бути видалена, оскільки була створена без var, // і тому доступна для налаштування. delete adminName; // вертає true // З іншого боку, empCount недоступна для налаштування, // оскільки використовувався оператор var. delete empCount; // вертає false // delete можна використовувати, щоб видаляти властивості об'єктів. delete EmployeeDetails.name; // вертає true // Навіть якщо властивість не існує, delete поверне "true". delete EmployeeDetails.salary; // вертає true // delete не діє на вбудовані статичні властивості. delete Math.PI; // вертає false // EmployeeDetails - властивість у глобальній області видимості. // Оскільки вона була визначена без "var", вона доступна для налаштування. delete EmployeeDetails; // вертає true function f() { var z = 44; // delete не діє на локальні змінні delete z; // вертає false }
delete
та ланцюжок прототипівУ наступному прикладі ми видаляємо особисту властивість об'єкта, в той час, як однойменна властивість доступна через ланцюжок прототипів:
function Foo() { this.bar = 10; } Foo.prototype.bar = 42; var 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
Коли ви видаляєте елемент масиву, довжина масиву не змінюється. Це зберігається, навіть якщо ви видалите останній елемент масиву.
Коли оператор delete
видаляє елемент масиву, цей елемент більше не існує у масиві. У наступному прикладі trees[3]
видаляється за допомогою delete
.
var trees = ['секвоя', 'лавр', 'кедр', 'дуб', 'клен']; delete trees[3]; if (3 in trees) { // це не виконається }
Якщо ви бажаєте, щоб елемент масиву існував, але мав значення undefined, скористайтесь значенням undefined
замість оператора delete
. У наступному прикладі елементу trees[3]
присвоюється значення undefined, але елемент масиву досі існує:
var trees = ['секвоя', 'лавр', 'кедр', 'дуб', 'клен']; trees[3] = undefined; if (3 in trees) { // це виконається }
Якщо замість цього ви хочете видалити елемент масиву, змінивши вміст масиву, скористайтесь методом {{jsxref("Array.splice", "splice")}}
. У наступному прикладі елемент trees[3]
повністю видаляється з масиву за допомогою методу {{jsxref("Array.splice", "splice")}}
:
var trees = ['секвоя', 'лавр', 'кедр', 'дуб', 'клен']; trees.splice(3,1); console.log(trees); // ["секвоя", "лавр", "кедр", "клен"]
Специфікація | Статус | Коментар |
---|---|---|
{{SpecName('ESDraft', '#sec-delete-operator', 'The delete Operator')}} | {{Spec2('ESDraft')}} | |
{{SpecName('ES6', '#sec-delete-operator', 'The delete Operator')}} | {{Spec2('ES6')}} | |
{{SpecName('ES5.1', '#sec-11.4.1', 'The delete Operator')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES1', '#sec-11.4.1', 'The delete Operator')}} | {{Spec2('ES1')}} | Початкове визначення. Реалізоване у JavaScript 1.2. |
{{Compat("javascript.operators.delete")}}
Хоча ECMAScript робить порядок перебору об'єктів залежним від реалізації, може здаватись, що усі основні веб-переглядачі підтримують порядок перебору, в якому властивість, додана першою, йде першою (принаймні, для не прототипних властивостей). Однак, у Internet Explorer при використанні delete
з властивістю, виникає дивна поведінка, яка заважає іншим переглядачам використовувати прості об'єкти, такі як об'єктні літерали, як впорядковані асоціативні масиви. У Explorer, хоча значення властивості дійсно стає undefined, але, якщо пізніше користувач знову додає властивість з таким самим ім'ям, властивість буде перебиратися на своїй старій позиції, а не в кінці перебору, як можна було б очікувати після видалення властивості та повторного її додавання.
Якщо ви хочете використовувати впорядкований асоціативний масив у кросбраузерному середовищі, використовуйте об'єкт {{jsxref("Map")}}, якщо він доступний, або імітуйте цю структуру двома окремими масивами (один для ключів, а інший для значень), або створіть масив об'єктів з однією властивістю, і т. д.