Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Оператор delete». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Оператор `delete` видаляє власну властивість з об'єкта, а не просто обнуляє її значення.** Він повертає `true`, якщо видалення вдалося, і `false`, якщо властивість неконфігурована. У масиві `delete` не зсуває елементи і не змінює `length`, а лишає «дірку» (empty item), тому для реального видалення потрібен `splice` або `filter`. Успадковані через прототип властивості та змінні, оголошені через `var`, `let` чи `const`, він не видаляє. ```javascript const user = { name: 'Alice', age: 25 }; delete user.age; console.log(user); // { name: 'Alice' } console.log('age' in user); // false ``` **Ключове:** `delete` прибирає сам ключ з об'єкта; присвоєння `undefined` лишає ключ на місці.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**Оператор `delete` у JavaScript видаляє властивості з об'єктів (або елементи з масивів).** Він прибирає саму властивість, а не тільки її значення, і має кілька тонких нюансів: не зсуває елементи масиву, не чіпає прототип і не працює зі змінними. ## Теорія ### TL;DR - Синтаксис: `delete object.property` або `delete object['property']`. - Видаляє сам ключ: після `delete` вираз `'key' in obj` дає `false`. - Повертає `true` при успіху і `false`, якщо властивість неконфігурована. - У масиві лишає «дірку»: `length` не змінюється, елементи не зсуваються. - Не видаляє успадковані через прототип властивості, лише власні. - Не працює зі змінними `var`, `let`, `const`; у строгому режимі невдале видалення кидає `TypeError`. ### Швидкий приклад ```javascript const obj = { a: 1, b: 2 }; delete obj.a; console.log(obj); // { b: 2 } console.log('a' in obj); // false ``` ### Синтаксис і приклад з об'єктом ```javascript delete object.property ``` або ```javascript delete object['property'] ``` Приклад: ```javascript const user = { name: 'Alice', age: 25 }; delete user.age; console.log(user); // { name: 'Alice' } console.log('age' in user); // false ``` > Оператор `delete` видаляє саму властивість з об'єкта, а не просто її значення. ### Повернене значення `delete` повертає логічне значення: | Випадок | Повертає | | --- | --- | | Видалення пройшло успішно | `true` | | Неможливо видалити (наприклад, властивість неконфігурована) | `false` | Приклад: ```javascript const obj = {}; Object.defineProperty(obj, 'x', { value: 10, configurable: false }); console.log(delete obj.x); // false console.log(obj.x); // 10 ``` Зверніть увагу: `delete` повертає `true` і тоді, коли такої властивості взагалі не було, бо після операції ключа в об'єкті точно немає. ### Поведінка з масивами ```javascript const arr = [10, 20, 30]; delete arr[1]; console.log(arr); // [10, <1 empty item>, 30] console.log(arr.length); // 3 ``` > Важливо: `delete` не зсуває елементи масиву, він просто видаляє значення, лишаючи «дірку» (`empty`). Якщо треба видалити елемент разом зі зміною довжини масиву, використовуйте методи: ```javascript arr.splice(1, 1); // видалить елемент і зсуне решту ``` Розріджений масив після `delete` поводиться нерівно: `forEach`, `map` і `filter` пропускають дірки, а `for` і `for...of` побачать `undefined`. ### `delete` проти присвоєння `undefined` Різниця між `delete` і присвоєнням `undefined`: ```javascript const user = { name: 'Tim', age: 25 }; user.age = undefined; console.log(user); // { name: 'Tim', age: undefined } console.log('age' in user); // true (ключ лишився) delete user.age; console.log(user); // { name: 'Tim' } console.log('age' in user); // false (ключ видалено) ``` > `delete` видаляє ключ повністю, а присвоєння `undefined` лише обнуляє значення. Це помітно у `Object.keys()`, `JSON.stringify()` і в циклі `for...in`. ### Прототипи, обмеження та підсумок `delete` не чіпає властивості, успадковані через прототип: ```javascript const person = { name: 'Alex' }; const user = Object.create(person); console.log('name' in user); // true delete user.name; // не видалить з прототипу console.log('name' in user); // true ``` > Він видаляє лише власні властивості об'єкта. Обмеження: 1. `delete` не працює зі змінними, оголошеними через `var`, `let` або `const`: ```javascript let x = 10; console.log(delete x); // false console.log(x); // 10 ``` > Видалити можна лише властивість об'єкта, а не змінну. 2. У строгому режимі (`"use strict"`) спроба видалити недопустиму властивість викличе помилку: ```javascript "use strict"; delete Object.prototype; // TypeError ``` Підсумкова таблиця: | Питання | Відповідь | | --- | --- | | Що робить | Видаляє властивість з об'єкта | | Працює з | Об'єктами, масивами | | Що повертає | `true` або `false` | | Не працює для | Змінних (`var`, `let`, `const`) | | Масиви | Не зсуває елементи, лишає «дірку» | | Безпечно для | Власних властивостей об'єкта | ### Типові помилки - Використовувати `delete` для видалення елемента масиву. Довжина не зміниться, лишиться дірка; потрібні `splice` або `filter`. - Плутати `delete obj.key` з `obj.key = undefined`: у другому випадку ключ лишається і потрапляє в `Object.keys()`. - Очікувати, що `delete` прибере успадковану властивість. Видаляти треба з того об'єкта, якому властивість належить. - Перевіряти результат `delete` як «чи існувала властивість»: для неіснуючого ключа він теж повертає `true`. - Забувати, що в строгому режимі невдале видалення кидає `TypeError`, а не мовчазне `false`. - Масово видаляти ключі в гарячому коді: це змінює приховані класи об'єкта і сповільнює його; часто краще створити новий об'єкт через деструктуризацію з rest.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.