Object.hasOwn() в JavaScript
- Что делает Object.hasOwn()
- Синтаксис
- Проверка свойства
- Имя свойства в переменной
- Разница с оператором in
- Свойство со значением undefined
- Почему не hasOwnProperty()
- Итого
Object.hasOwn() проверяет, есть ли свойство именно в самом объекте.
let user = {
name: 'Анна',
age: 28,
};
console.log(Object.hasOwn(user, 'name')); // true
console.log(Object.hasOwn(user, 'email')); // false
Метод возвращает true, если свойство принадлежит объекту. Если такого свойства нет, вернется false.
Что делает Object.hasOwn()
У объекта могут быть собственные свойства и свойства, доступные через прототип.
Object.hasOwn() проверяет только собственные свойства.
let user = {
name: 'Анна',
};
console.log(Object.hasOwn(user, 'name')); // true
console.log(Object.hasOwn(user, 'toString')); // false
Свойство name находится в самом объекте user. А toString доступен через прототип, поэтому метод возвращает false.
Синтаксис
Object.hasOwn(object, propertyName);
object - объект, который нужно проверить.
propertyName - имя свойства. Обычно его передают строкой.
Object.hasOwn(user, 'age')
Проверка свойства
Возьмем объект с настройками пользователя.
let settings = {
theme: 'dark',
fontSize: 16,
};
if (Object.hasOwn(settings, 'theme')) {
console.log('Тема указана');
}
Если свойство theme есть в самом объекте settings, условие выполнится.
Такую проверку удобно использовать, когда объект может прийти с разным набором полей.
Имя свойства в переменной
Имя свойства можно хранить в переменной.
let user = {
name: 'Анна',
age: 28,
};
let field = 'age';
console.log(Object.hasOwn(user, field)); // true
В этом случае JavaScript берет значение переменной field и проверяет свойство age.
Разница с оператором in
Оператор in проверяет шире: он смотрит и собственные свойства, и свойства из прототипа.
let user = {
name: 'Анна',
};
console.log('name' in user); // true
console.log('toString' in user); // true
console.log(Object.hasOwn(user, 'name')); // true
console.log(Object.hasOwn(user, 'toString')); // false
Для свойства name оба варианта вернули true. Для toString результат отличается, потому что это не собственное свойство объекта user.
Если нужно узнать, доступно ли свойство вообще, можно использовать in. Если важно проверить именно собственное свойство объекта, используйте Object.hasOwn().
Свойство со значением undefined
Object.hasOwn() проверяет наличие свойства, а не его значение.
let user = {
name: 'Анна',
email: undefined,
};
console.log(Object.hasOwn(user, 'email')); // true
console.log(user.email); // undefined
Свойство email есть в объекте, даже если внутри лежит undefined.
Это важное отличие от проверки вида user.email === undefined, потому что такая проверка не всегда показывает, есть свойство или нет.
Почему не hasOwnProperty()
В старом коде часто можно встретить метод hasOwnProperty().
user.hasOwnProperty('name')
Он решает похожую задачу, но вызывается у самого объекта. Это не всегда удобно, потому что объект может не иметь такого метода или может хранить свое свойство с таким же именем.
let user = {
name: 'Анна',
hasOwnProperty: 'значение',
};
console.log(Object.hasOwn(user, 'name')); // true
Object.hasOwn() не зависит от свойства hasOwnProperty внутри объекта, поэтому в современном коде он обычно читается проще и надежнее.
Итого
Object.hasOwn()проверяет собственное свойство объекта.- Метод возвращает
trueилиfalse. inучитывает свойства из прототипа, аObject.hasOwn()- нет.- Если свойство есть, но его значение
undefined, метод все равно вернетtrue. - В современном коде
Object.hasOwn()удобнее прямого вызоваhasOwnProperty().