diff options
Diffstat (limited to 'files/uk/web/javascript/reference/operators/delete/index.html')
| -rw-r--r-- | files/uk/web/javascript/reference/operators/delete/index.html | 298 |
1 files changed, 0 insertions, 298 deletions
diff --git a/files/uk/web/javascript/reference/operators/delete/index.html b/files/uk/web/javascript/reference/operators/delete/index.html deleted file mode 100644 index 3df636e0a5..0000000000 --- a/files/uk/web/javascript/reference/operators/delete/index.html +++ /dev/null @@ -1,298 +0,0 @@ ---- -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> |
