Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Наявність властивості в об'єкті». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`'key' in obj`** перевіряє, чи існує властивість узагалі (включно з успадкованими від прототипу), а **`Object.hasOwn(obj, 'key')`** перевіряє лише власні властивості об'єкта. **Ключове:** перевірка через `obj.key !== undefined` не завжди коректна, бо властивість може існувати зі значенням `undefined`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняУ JavaScript є **кілька способів перевірити**, чи є в об'єкті та чи інша властивість. Кожен із них працює трохи по-різному: розберемо всі, з прикладами і нюансами. --- ## 1. Оператор `in` Найпряміший і найнадійніший спосіб. ```javascript const user = { name: 'Oleh', age: 25 }; console.log('name' in user); // true console.log('email' in user); // false ``` > Перевіряє, **чи існує властивість узагалі** (включно з успадкованими від прототипу). --- ### Приклад зі спадкуванням ```javascript const person = { isHuman: true }; const user = Object.create(person); user.name = 'Oleh'; console.log('name' in user); // true (власна) console.log('isHuman' in user); // true (успадкована) ``` --- ## 2. Метод `hasOwnProperty()` Перевіряє **лише власні властивості** (тобто ті, що реально належать самому об'єкту, а не прототипу). ```javascript const person = { isHuman: true }; const user = Object.create(person); user.name = 'Oleh'; console.log(user.hasOwnProperty('name')); // true console.log(user.hasOwnProperty('isHuman')); // false ``` > Використовуй, якщо потрібно переконатися, що властивість визначена **в самому об'єкті**, а не успадкована. --- ### Обережно: Якщо хтось перевизначив `hasOwnProperty`, його краще викликати так: ```javascript Object.prototype.hasOwnProperty.call(user, 'name'); ``` --- ## 3. Перевірка через `undefined` Простий, але не завжди безпечний спосіб: ```javascript const user = { name: 'Oleh' }; console.log(user.name !== undefined); // true console.log(user.email !== undefined); // false ``` > Проблема: властивість може існувати, але мати значення `undefined`. ```javascript const user = { name: undefined }; console.log('name' in user); // true console.log(user.name !== undefined); // false (обманює) ``` --- ## 4. Метод `Object.hasOwn()` (сучасний, ES2022) Це "нова версія" `hasOwnProperty`, але безпечніша (не залежить від ланцюжка прототипів). ```javascript const user = { name: 'Oleh' }; console.log(Object.hasOwn(user, 'name')); // true console.log(Object.hasOwn(user, 'email')); // false ``` > Рекомендується використовувати замість `hasOwnProperty()` у сучасному коді. --- ## Порівняння способів | Метод | Перевіряє успадковані властивості | Перевіряє лише свої | Безпечний для будь-яких об'єктів | Приклад | |---|---|---|---|---| | `'key' in obj` | Так | Ні | Так | `'name' in user` | | `obj.hasOwnProperty('key')` | Ні | Так | Не завжди (може бути перевизначений) | `user.hasOwnProperty('name')` | | `Object.hasOwn(obj, 'key')` | Ні | Так | Так | `Object.hasOwn(user, 'name')` | | `obj.key !== undefined` | Не завжди | Ні | Так | `user.name !== undefined` | --- ## 5. Перевірка через `Reflect.has()` (альтернатива `in`) Ще один варіант (з Reflect API): ```javascript const user = { name: 'Oleh' }; console.log(Reflect.has(user, 'name')); // true console.log(Reflect.has(user, 'email')); // false ``` > Працює точно як `in`, але зручний у "рефлексивному" (метапрограмному) коді. --- ## Підсумок | Мета | Найкращий спосіб | |---|---| | Перевірити **будь-яку** властивість (включно з прототипами) | `'prop' in obj` | | Перевірити **лише власну** властивість | `Object.hasOwn(obj, 'prop')` | | Підтримка старих браузерів | `obj.hasOwnProperty('prop')` | | Перевірити, що **значення не** `undefined` | `obj.key !== undefined` (обережно) | --- ## Коротко - `in`: перевіряє наявність властивості (у тому числі успадкованої). - `hasOwnProperty()`: перевіряє лише власні властивості. - `Object.hasOwn()`: сучасна і безпечна альтернатива. - Перевірка `!== undefined` не завжди коректна.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.