Learn JavaScript

Object.hasOwn() - метод для безопасной проверки собственных свойств объекта в JavaScript

Object.hasOwn() проверяет, есть ли у объекта собственное свойство.

Это современный и более безопасный вариант по сравнению с hasOwnProperty().

Синтаксис

Object.hasOwn(obj, propertyName)

obj - объект, который нужно проверить.

propertyName - имя свойства.

Что делает Object.hasOwn()

Если свойство принадлежит самому объекту, метод вернёт true.

const user = {
  name: "Anna",
};

console.log(Object.hasOwn(user, "name")); // true
console.log(Object.hasOwn(user, "age"));  // false

Что возвращает Object.hasOwn()

Object.hasOwn() всегда возвращает булево значение:

  • true, если свойство есть у самого объекта
  • false, если такого собственного свойства нет
const user = { name: "Anna" };

console.log(Object.hasOwn(user, "name")); // true
console.log(Object.hasOwn(user, "role")); // false

Только собственные свойства

Метод проверяет только собственные свойства объекта.

Свойства из прототипа в результат не входят.

const base = { role: "user" };
const person = Object.create(base);

person.name = "Anna";

console.log(Object.hasOwn(person, "name")); // true
console.log(Object.hasOwn(person, "role")); // false

Хотя person.role доступно, это свойство пришло из прототипа.

Object.hasOwn() и оператор in

Эти проверки часто путают.

const base = { role: "user" };
const person = Object.create(base);

person.name = "Anna";

console.log("name" in person); // true
console.log("role" in person); // true

console.log(Object.hasOwn(person, "name")); // true
console.log(Object.hasOwn(person, "role")); // false

in проверяет и собственные, и наследуемые свойства.

Object.hasOwn() проверяет только собственные.

Если значение равно undefined

Метод проверяет наличие свойства, а не его значение.

const settings = {
  theme: undefined,
};

console.log(Object.hasOwn(settings, "theme")); // true
console.log(settings.theme); // undefined

То есть undefined не означает, что свойства нет.

Object.hasOwn() и hasOwnProperty()

По смыслу эти методы очень похожи:

const user = { name: "Anna" };

console.log(user.hasOwnProperty("name")); // true
console.log(Object.hasOwn(user, "name")); // true

Но Object.hasOwn() удобнее и безопаснее.

Почему Object.hasOwn() безопаснее

У объекта может быть собственное свойство с именем hasOwnProperty.

const obj = {
  hasOwnProperty: "test",
  name: "Anna",
};

// obj.hasOwnProperty("name"); // Ошибка

Object.hasOwn() в такой ситуации продолжает работать нормально:

console.log(Object.hasOwn(obj, "name")); // true

Object.create(null)

У объекта без прототипа метода hasOwnProperty() вообще нет.

const dict = Object.create(null);
dict.name = "Anna";

console.log(Object.hasOwn(dict, "name")); // true

Это одна из причин, почему Object.hasOwn() удобно использовать в новом коде.

Массивы и Object.hasOwn()

Массив тоже является объектом, поэтому метод работает и с ним.

const arr = ["a", "b"];

console.log(Object.hasOwn(arr, 0)); // true
console.log(Object.hasOwn(arr, 2)); // false

Для массива индексы тоже считаются свойствами.

Когда это полезно

Object.hasOwn() удобно использовать, когда:

  • нужно проверить, есть ли ключ у самого объекта
  • нужно отличить собственное свойство от наследуемого
  • объект может быть создан через Object.create(null)
  • хочется использовать более современный и безопасный способ проверки

Пример:

const config = {
  lang: "ru",
};

if (Object.hasOwn(config, "lang")) {
  console.log("Ключ lang есть");
}

Object.hasOwn() не меняет объект

Метод только проверяет наличие свойства и не изменяет сам объект.

const user = { name: "Anna" };
const result = Object.hasOwn(user, "name");

console.log(user);   // { name: "Anna" }
console.log(result); // true

Частые ошибки

Путать Object.hasOwn() и in

const base = { role: "user" };
const person = Object.create(base);

console.log(Object.hasOwn(person, "role")); // false
console.log("role" in person); // true

Это разные проверки.

Считать, что undefined означает отсутствие свойства

const obj = { value: undefined };

console.log(Object.hasOwn(obj, "value")); // true

Свойство есть, просто его значение равно undefined.

Думать, что метод работает только с обычными объектами

const arr = ["a", "b"];

console.log(Object.hasOwn(arr, 0)); // true

Метод работает и с массивами.

Быстрая памятка

  • Object.hasOwn() проверяет только собственные свойства объекта
  • свойства из прототипа в результат не входят
  • метод возвращает true или false
  • он безопаснее, чем hasOwnProperty()
  • особенно удобен для объектов без прототипа

Коротко

Object.hasOwn() - это современный способ проверить, принадлежит ли свойство самому объекту. Главное, что стоит запомнить: метод не смотрит в прототип и удобнее, чем hasOwnProperty(), потому что работает безопасно даже в сложных случаях.