Object.hasOwn()
Статичний метод Object.hasOwn()
(має власну) повертає true
, якщо заданий об'єкт має вказану властивість як власну. Якщо ця властивість успадкована чи не існує, то він повертає false
.
Примітка:
Object.hasOwn()
задуманий як заміна дляObject.prototype.hasOwnProperty()
.
Спробуйте його в дії
Синтаксис
Object.hasOwn(obj, prop)
Параметри
obj
Примірник об'єкта JavaScript, який має бути перевірений.
prop
Ім'я властивості, яка має бути перевірена –
String
або Symbol.
Повернене значення
true
, якщо заданий об'єкт безпосередньо має визначену задану властивість.
Інакше – false
Опис
Метод Object.hasOwn()
повертає true
, якщо вказана властивість є безпосередньою властивістю об'єкта – навіть якщо її значенням є null
або undefined
.
Цей метод повертає false
, якщо така властивість успадкована або не була оголошена взагалі.
На відміну від оператора in
, цей метод не перевіряє на вказану властивість ланцюжок прототипів об'єкта.
Рекомендовано віддавати перевагу цьому методові замість Object.prototype.hasOwnProperty()
, оскільки він працює для null
-прототипних об'єктів, і для об'єктів, які перевизначили успадкований метод hasOwnProperty()
. Хоча можливо обійти ці проблеми, викликавши Object.prototype.hasOwnProperty()
на зовнішньому об'єкті, Object.hasOwn()
є більш інтуїтивно зрозумілим.
Приклади
Застосування hasOwn для перевірки існування властивості
Наступний код демонструє, як визначити, чи містить об'єкт example
властивість prop
.
const example = {};
Object.hasOwn(example, "prop"); // false - 'prop' не була оголошена
example.prop = "exists";
Object.hasOwn(example, "prop"); // true - 'prop' була визначенв
example.prop = null;
Object.hasOwn(example, "prop"); // true - існує власна властивість зі значенням null
example.prop = undefined;
Object.hasOwn(example, "prop"); // true - існує власна властивість зі значенням undefined
Безпосередні й успадковані властивості
Наступний приклад розрізняє безпосередні властивості та властивості, успадковані за ланцюжком прототипів:
const example = {};
example.prop = "існує";
// `hasOwn` поверне true лише для безпосередніх властивостей:
Object.hasOwn(example, "prop"); // true
Object.hasOwn(example, "toString"); // false
Object.hasOwn(example, "hasOwnProperty"); // false
// Оператор `in` поверне true і для безпосередніх, і для успадкованих властивостей:
"prop" in example; // true
"toString" in example; // true
"hasOwnProperty" in example; // true
Ітерування властивостей об'єкта
Щоб ітерувати перелічувані властивості об'єкта, необхідно використовувати:
const example = { foo: true, bar: true };
for (const name of Object.keys(example)) {
// …
}
Але якщо потрібно використати for...in
, то можна використати Object.hasOwn()
для пропуску успадкованих властивостей:
const example = { foo: true, bar: true };
for (const name in example) {
if (Object.hasOwn(example, name)) {
// …
}
}
Перевірка існування індексу в Array
Елементи Array
визначаються як безпосередні властивості, тож для перевірки існування певного індексу можна використати метод hasOwn()
:
const fruits = ["Яблуко", "Банан", "Кавун", "Апельсин"];
Object.hasOwn(fruits, 3); // true ('Апельсин')
Object.hasOwn(fruits, 4); // false - не визначено
Проблемні для hasOwnProperty випадки
Цей розділ демонструє те, що hasOwn()
не піддається проблемам, які впливають на hasOwnProperty
. По-перше, його можна використовувати з об'єктами, які мають власну реалізацію hasOwnProperty()
:
const foo = {
hasOwnProperty() {
return false;
},
bar: "Драконів геть з офісу",
};
if (Object.hasOwn(foo, "bar")) {
console.log(foo.bar); // true - власна реалізація hasOwnProperty() не впливає на Object
}
Також його можна використовувати щодо null
-прототипних об'єктів. Вони не успадковують властивості від Object.prototype
, тож hasOwnProperty()
недоступний.
const foo = Object.create(null);
foo.prop = "існує";
if (Object.hasOwn(foo, "prop")) {
console.log(foo.prop); // true - працює незалежно від того, як створено об'єкт.
}
Специфікації
Сумісність із браузерами
desktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
hasOwn
|
Chrome Full support 93 | Edge Full support 93 | Firefox Full support 92 | Internet Explorer No support Ні | Opera Full support 79 | Safari Full support 15.4 | WebView Android Full support 93 | Chrome Android Full support 93 | Firefox for Android Full support 92 | Opera Android No support Ні | Safari on iOS Full support 15.4 | Samsung Internet Full support 17.0 | Deno Full support 1.13 | Node.js Full support 16.9.0 |