hasOwnProperty() в JavaScript
- Что делает hasOwnProperty()
- Синтаксис
- Проверка свойства
- Имя свойства в переменной
- Разница с оператором in
- Свойство со значением undefined
- Ограничения метода
- hasOwnProperty() и Object.hasOwn()
- Итого
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().