aboutsummaryrefslogtreecommitdiff
path: root/files/uk/web/javascript/reference/operators/delete
diff options
context:
space:
mode:
authorPeter Bengtsson <mail@peterbe.com>2020-12-08 14:43:23 -0500
committerPeter Bengtsson <mail@peterbe.com>2020-12-08 14:43:23 -0500
commit218934fa2ed1c702a6d3923d2aa2cc6b43c48684 (patch)
treea9ef8ac1e1b8fe4207b6d64d3841bfb8990b6fd0 /files/uk/web/javascript/reference/operators/delete
parent074785cea106179cb3305637055ab0a009ca74f2 (diff)
downloadtranslated-content-218934fa2ed1c702a6d3923d2aa2cc6b43c48684.tar.gz
translated-content-218934fa2ed1c702a6d3923d2aa2cc6b43c48684.tar.bz2
translated-content-218934fa2ed1c702a6d3923d2aa2cc6b43c48684.zip
initial commit
Diffstat (limited to 'files/uk/web/javascript/reference/operators/delete')
-rw-r--r--files/uk/web/javascript/reference/operators/delete/index.html298
1 files changed, 298 insertions, 0 deletions
diff --git a/files/uk/web/javascript/reference/operators/delete/index.html b/files/uk/web/javascript/reference/operators/delete/index.html
new file mode 100644
index 0000000000..3df636e0a5
--- /dev/null
+++ b/files/uk/web/javascript/reference/operators/delete/index.html
@@ -0,0 +1,298 @@
+---
+title: Оператор delete
+slug: Web/JavaScript/Reference/Operators/delete
+tags:
+ - JavaScript
+ - Object
+ - delete
+ - Властивість
+ - Оператор
+ - керування пам'яттю
+translation_of: Web/JavaScript/Reference/Operators/delete
+---
+<div>{{jsSidebar("Operators")}}</div>
+
+<p><span class="seoSummary">Оператор JavaScript <strong><code>delete</code></strong> видаляє властивість об'єкта. Якщо на цю властивість більше немає посилань, пам'ять під неї зрештою звільняється автоматично.</span></p>
+
+<div>{{EmbedInteractiveExample("pages/js/expressions-deleteoperator.html")}}</div>
+
+
+
+<h2 id="Синтаксис">Синтаксис</h2>
+
+<pre class="syntaxbox">delete <em>вираз</em> </pre>
+
+<p>де <em>вираз</em> має вертати посилання на <a href="/uk/docs/Glossary/property/JavaScript">властивість</a>, наприклад:</p>
+
+<pre class="syntaxbox">delete <em>object.property</em>
+delete <em>object</em>['<em>property</em>']
+</pre>
+
+<h3 id="Параметри">Параметри</h3>
+
+<dl>
+ <dt><code>object</code></dt>
+ <dd>Ім'я об'єкта, чи вираз, що повертає цей об'єкт.</dd>
+ <dt><code>property</code></dt>
+ <dd>Властивість, яку треба видалити.</dd>
+</dl>
+
+<h3 id="Значення_що_повертається">Значення, що повертається</h3>
+
+<p>Завжди <code>true</code>, окрім випадків, коли властивість є <a href="/uk/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty">особистою</a> властивістю, <a href="/uk/docs/Web/JavaScript/Reference/Errors/Cant_delete">недоступною для налаштування</a>, в цьому випадку у нестрогому режимі повертається <code>false</code>.</p>
+
+<h3 id="Винятки">Винятки</h3>
+
+<p>Викидає {{jsxref("TypeError")}} у <a href="/uk/docs/Web/JavaScript/Reference/Strict_mode">строгому режимі</a>, якщо властивість є особистою властивістю, недоступною для налаштування.</p>
+
+<h2 id="Опис">Опис</h2>
+
+<p>Попри розповсюджену думку, оператор <code>delete</code> не має <strong>нічого</strong> спільного з прямим вивільненням пам'яті. Керування пам'яттю відбувається опосередковано через розривання посилань. Більше інформації дивіться у статті <a href="/uk/docs/Web/JavaScript/Memory_Management">Керування пам'яттю</a>.</p>
+
+<p>Оператор <code><strong>delete</strong></code> видаляє задану властивість з об'єкта. В разі успішного видалення, він поверне <code>true</code>, інакше поверне <code>false</code>. Однак, важливо враховувати наступні сценарії:</p>
+
+<ul>
+ <li>Якщо властивість, яку ви намагаєтесь видалити, не існує, <code>delete</code> не матиме жодного ефекту та поверне <code>true</code></li>
+ <li>Якщо властивість з таким самим ім'ям існує у ланцюзі прототипів об'єкта, тоді, після видалення, об'єкт використовуватиме властивість з ланцюжка прототипів (іншими словами, <code>delete</code> має ефект лише для особистих властивостей).</li>
+ <li>Будь-яка властивість, оголошена через {{jsxref("Statements/var","var")}}, не може бути видалена з глобальної області видимості чи з області видимості функції.
+ <ul>
+ <li>Таким чином, <code>delete</code> не може видаляти функції у глобальній області видимості (незалежно від того, чи є вони оголошеннями функції, чи функціональними виразами).</li>
+ <li>Функції, які є частиною об'єкта (не є частиною глобальної області видимості), можуть бути видалені оператором <code>delete</code>.</li>
+ </ul>
+ </li>
+ <li>Будь-яка властивість, оголошена через {{jsxref("Statements/let","let")}} або {{jsxref("Statements/const","const")}}, не може бути видалена з області видимості, всередині якої вона була оголошена.</li>
+ <li>Властивості, недоступні для налаштування, не можуть бути видалені. Це також стосується властивостей вбудованих об'єктів, таких як {{jsxref("Math")}}, {{jsxref("Array")}}, {{jsxref("Object")}}, та властивостей, які були створені як недоступні для налаштування за допомогою методів на кшталт {{jsxref("Object.defineProperty()")}}.</li>
+</ul>
+
+<p>Наступний фрагмент надає простий приклад:</p>
+
+<pre class="brush: js">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
+</pre>
+
+<h3 id="Властивості_недоступні_для_налаштування">Властивості, недоступні для налаштування</h3>
+
+<p>Коли властивість позначена як недоступна для налаштування, <code>delete</code> не матиме жодного ефекту та поверне <code>false</code>. У строгому режимі це спричинить помилку <code>TypeError</code>.</p>
+
+<pre class="brush: js">var Employee = {};
+Object.defineProperty(Employee, 'name', {configurable: false});
+
+console.log(delete Employee.name); // вертає false
+</pre>
+
+<p>{{jsxref("Statements/var","var")}}, {{jsxref("Statements/let","let")}} та {{jsxref("Statements/const","const")}} створюють властивості, недоступні для налаштування, які не можуть бути видалені оператором <code>delete</code>:</p>
+
+<pre class="brush: js">var nameOther = 'XYZ';
+
+// Ми можемо звернутися до цієї глобальної властивості так:
+Object.getOwnPropertyDescriptor(window, 'nameOther');
+
+// виведе: Object {value: "XYZ",
+// writable: true,
+// enumerable: true,
+// <strong>configurable: false</strong>}
+
+// Оскільки "nameOther" додана за допомогою ключового
+// слова var, вона позначена як недоступна для налаштування
+
+delete nameOther; // вертає false</pre>
+
+<p>У строгому режимі це спричинило б виняток.</p>
+
+<h3 id="Строгий_режим_проти_нестрогого_режиму">Строгий режим проти нестрогого режиму</h3>
+
+<p>У строгому режимі, якщо <code>delete</code> використовується на прямому посиланні на змінну, аргумент функції чи ім'я функції, це викине {{jsxref("SyntaxError")}}<strong>.</strong></p>
+
+<p>Будь-яка змінна, оголошена через <code>var</code>, позначається як недоступна для налаштування. У наступному прикладі змінна <code>salary</code> недоступна для налаштування та не може бути видалена. У нестрогому режимі ця операція <code>delete</code> поверне <code>false</code>.</p>
+
+<pre class="brush: js">function Employee() {
+ delete salary;
+ var salary;
+}
+
+Employee();
+</pre>
+
+<p>Подивимось, як той самий код поводиться у строгому режимі. Замість того, щоб повернути <code>false</code>, код викидає <code>SyntaxError</code>.</p>
+
+<pre class="brush: js">"use strict";
+
+function Employee() {
+ delete salary; // SyntaxError
+ var salary;
+}
+
+// Схожим чином, пряме звернення до фукнції
+// оператором delete викине SyntaxError
+
+function DemoFunction() {
+ //якийсь код
+}
+
+delete DemoFunction; // SyntaxError
+</pre>
+
+<h2 id="Приклади">Приклади</h2>
+
+<pre class="brush: js">// Створює властивість 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
+
+<strong>// </strong>Навіть якщо властивість не існує, 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
+}
+</pre>
+
+<h3 id="delete_та_ланцюжок_прототипів"><code>delete</code> та ланцюжок прототипів</h3>
+
+<p>У наступному прикладі ми видаляємо особисту властивість об'єкта, в той час, як однойменна властивість доступна через ланцюжок прототипів:</p>
+
+<pre class="brush: js">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</pre>
+
+<h3 id="Видалення_елементів_масиву">Видалення елементів масиву</h3>
+
+<p>Коли ви видаляєте елемент масиву, довжина масиву не змінюється. Це зберігається, навіть якщо ви видалите останній елемент масиву.</p>
+
+<p>Коли оператор <code>delete</code> видаляє елемент масиву, цей елемент більше не існує у масиві. У наступному прикладі <code>trees[3]</code> видаляється за допомогою <code>delete</code>.</p>
+
+<pre class="brush: js">var trees = ['секвоя', 'лавр', 'кедр', 'дуб', 'клен'];
+delete trees[3];
+if (3 in trees) {
+ // це не виконається
+}</pre>
+
+<p>Якщо ви бажаєте, щоб елемент масиву існував, але мав значення undefined, скористайтесь значенням <code>undefined</code> замість оператора <code>delete</code>. У наступному прикладі елементу <code>trees[3]</code> присвоюється значення undefined, але елемент масиву досі існує:</p>
+
+<pre class="brush: js">var trees = ['секвоя', 'лавр', 'кедр', 'дуб', 'клен'];
+trees[3] = undefined;
+if (3 in trees) {
+ // це виконається
+}</pre>
+
+<p>Якщо замість цього ви хочете видалити елемент масиву, змінивши вміст масиву, скористайтесь методом <code>{{jsxref("Array.splice", "splice")}}</code>. У наступному прикладі елемент <code>trees[3]</code> повністю видаляється з масиву за допомогою методу <code>{{jsxref("Array.splice", "splice")}}</code>:</p>
+
+<pre class="brush: js">var trees = ['секвоя', 'лавр', 'кедр', 'дуб', 'клен'];
+trees.splice(3,1);
+console.log(trees); // ["секвоя", "лавр", "кедр", "клен"]
+</pre>
+
+<h2 id="Специфікації">Специфікації</h2>
+
+<table class="standard-table">
+ <tbody>
+ <tr>
+ <th scope="col">Специфікація</th>
+ <th scope="col">Статус</th>
+ <th scope="col">Коментар</th>
+ </tr>
+ <tr>
+ <td>{{SpecName('ESDraft', '#sec-delete-operator', 'The delete Operator')}}</td>
+ <td>{{Spec2('ESDraft')}}</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>{{SpecName('ES6', '#sec-delete-operator', 'The delete Operator')}}</td>
+ <td>{{Spec2('ES6')}}</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>{{SpecName('ES5.1', '#sec-11.4.1', 'The delete Operator')}}</td>
+ <td>{{Spec2('ES5.1')}}</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>{{SpecName('ES1', '#sec-11.4.1', 'The delete Operator')}}</td>
+ <td>{{Spec2('ES1')}}</td>
+ <td>Початкове визначення. Реалізоване у JavaScript 1.2.</td>
+ </tr>
+ </tbody>
+</table>
+
+<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2>
+
+
+
+<p>{{Compat("javascript.operators.delete")}}</p>
+
+<h2 id="Примітки_щодо_кросбраузерності">Примітки щодо кросбраузерності</h2>
+
+<p>Хоча ECMAScript робить порядок перебору об'єктів залежним від реалізації, може здаватись, що усі основні веб-переглядачі підтримують порядок перебору, в якому властивість, додана першою, йде першою (принаймні, для не прототипних властивостей). Однак, у Internet Explorer при використанні <code>delete</code> з властивістю, виникає дивна поведінка, яка заважає іншим переглядачам використовувати прості об'єкти, такі як об'єктні літерали, як впорядковані асоціативні масиви. У Explorer, хоча <em>значення </em>властивості дійсно стає undefined, але, якщо пізніше користувач знову додає властивість з таким самим ім'ям, властивість буде перебиратися на своїй <em>старій</em> позиції, а не в кінці перебору, як можна було б очікувати після видалення властивості та повторного її додавання.</p>
+
+<p>Якщо ви хочете використовувати впорядкований асоціативний масив у кросбраузерному середовищі, використовуйте об'єкт {{jsxref("Map")}}, якщо він доступний, або імітуйте цю структуру двома окремими масивами (один для ключів, а інший для значень), або створіть масив об'єктів з однією властивістю, і т. д.</p>
+
+<h2 id="Див._також">Див. також</h2>
+
+<ul>
+ <li><a href="http://perfectionkills.com/understanding-delete/">In depth analysis on delete</a></li>
+ <li>{{jsxref("Reflect.deleteProperty()")}}</li>
+ <li>{{jsxref("Map.prototype.delete()")}}</li>
+</ul>