Learn JavaScript

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

hasOwnProperty() проверяет, есть ли свойство у самого объекта.

Главная идея метода в том, что он не смотрит в прототип, а проверяет только собственные свойства.

Синтаксис

obj.hasOwnProperty(propertyName)

propertyName - имя свойства, которое нужно проверить.

Что делает hasOwnProperty()

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

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

console.log(user.hasOwnProperty("name")); // true
console.log(user.hasOwnProperty("age"));  // false

Что возвращает hasOwnProperty()

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

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

console.log(user.hasOwnProperty("name")); // true
console.log(user.hasOwnProperty("role")); // false

Это главное, что нужно запомнить про метод.

Собственные и наследуемые свойства

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

Свойства из прототипа в результат не засчитываются.

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

person.name = "Anna";

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

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

hasOwnProperty() и оператор 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(person.hasOwnProperty("name")); // true
console.log(person.hasOwnProperty("role")); // false

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

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

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

Это важный нюанс: метод проверяет наличие свойства, а не его значение.

const user = {
  age: undefined,
};

console.log(user.hasOwnProperty("age")); // true
console.log(user.age); // undefined

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

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

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

  • нужно отличить собственное свойство от наследуемого
  • нужно точно проверить наличие ключа в объекте
  • значение свойства может быть undefined

Пример:

const settings = {
  theme: undefined,
};

if (settings.hasOwnProperty("theme")) {
  console.log("Ключ theme есть");
}

Объект может переопределить hasOwnProperty

Иногда у объекта может быть собственное свойство с таким же именем.

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

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

В таком случае безопаснее писать так:

console.log(Object.prototype.hasOwnProperty.call(obj, "name")); // true

Это более надёжный вариант.

Object.create(null)

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

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

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

Для такого объекта безопаснее использовать:

console.log(Object.prototype.hasOwnProperty.call(dict, "name")); // true

hasOwnProperty() и Object.hasOwn()

В современном JavaScript часто используют Object.hasOwn().

const user = { name: "Anna" };

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

У этого способа есть плюс:

  • он работает безопаснее
  • не зависит от того, есть ли у объекта свой hasOwnProperty
  • подходит для объектов без прототипа

Поэтому в новом коде часто предпочитают именно Object.hasOwn().

hasOwnProperty() не меняет объект

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

const user = { name: "Anna" };
const result = user.hasOwnProperty("name");

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

Массивы и hasOwnProperty()

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

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

console.log(arr.hasOwnProperty(0)); // true
console.log(arr.hasOwnProperty(2)); // false

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

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

Путать hasOwnProperty() и in

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

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

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

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

const obj = { value: undefined };

console.log(obj.hasOwnProperty("value")); // true

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

Вызывать hasOwnProperty() у объекта без прототипа

const dict = Object.create(null);

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

В такой ситуации лучше использовать Object.hasOwn() или Object.prototype.hasOwnProperty.call(...).

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

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

Коротко

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