hasOwnProperty() в JavaScript

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

let user = {
  name: 'Анна',
  age: 28,
};

console.log(user.hasOwnProperty('name')); // true
console.log(user.hasOwnProperty('email')); // false

Метод возвращает true, если свойство принадлежит объекту. Если такого свойства нет, вернется false.

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

У объекта могут быть собственные свойства и свойства, которые доступны через прототип.

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

let user = {
  name: 'Анна',
};

console.log(user.hasOwnProperty('name')); // true
console.log(user.hasOwnProperty('toString')); // false

Свойство name есть прямо в объекте user. А toString доступен через прототип, поэтому метод возвращает false.

Синтаксис

object.hasOwnProperty(propertyName);

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

propertyName - имя свойства. Обычно его передают строкой.

user.hasOwnProperty('age')

Проверка свойства

Метод удобно использовать в условии.

let settings = {
  theme: 'dark',
  fontSize: 16,
};

if (settings.hasOwnProperty('theme')) {
  console.log('Тема указана');
}

Условие выполнится, потому что свойство theme находится в самом объекте settings.

Имя свойства в переменной

Имя свойства можно хранить в переменной.

let user = {
  name: 'Анна',
  age: 28,
};

let field = 'age';

console.log(user.hasOwnProperty(field)); // true

В этом случае JavaScript берет значение переменной field и проверяет свойство age.

Разница с оператором in

Оператор in проверяет шире: он учитывает и собственные свойства, и свойства из прототипа.

let user = {
  name: 'Анна',
};

console.log('name' in user); // true
console.log('toString' in user); // true

console.log(user.hasOwnProperty('name')); // true
console.log(user.hasOwnProperty('toString')); // false

Если нужно узнать, доступно ли свойство вообще, можно использовать in. Если нужно проверить только собственное свойство объекта, подойдет hasOwnProperty().

Свойство со значением undefined

hasOwnProperty() проверяет наличие свойства, а не его значение.

let user = {
  name: 'Анна',
  email: undefined,
};

console.log(user.hasOwnProperty('email')); // true
console.log(user.email); // undefined

Свойство email есть в объекте, даже если его значение равно undefined.

Ограничения метода

hasOwnProperty() вызывается у самого объекта. Из-за этого есть ситуации, где такой вызов может быть неудобен.

Например, объект может иметь собственное свойство с таким же именем.

let user = {
  name: 'Анна',
  hasOwnProperty: 'значение',
};

console.log(user.hasOwnProperty('name')); // TypeError

В этом примере user.hasOwnProperty уже не метод, а строка.

Еще один случай - объект без прототипа.

let user = Object.create(null);

user.name = 'Анна';

console.log(user.hasOwnProperty('name')); // TypeError

У такого объекта нет метода hasOwnProperty(), потому что он не наследует его от Object.prototype.

hasOwnProperty() и Object.hasOwn()

В современном коде для такой проверки чаще используют Object.hasOwn().

let user = {
  name: 'Анна',
  hasOwnProperty: 'значение',
};

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

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

Но hasOwnProperty() все равно важно знать: он часто встречается в старом коде и в примерах.

Итого

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