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
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
hasOwn
Chrome Full support 93
Edge Full support 93
Firefox Full support 92
Internet Explorer No support No
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 No
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

Дивіться також