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().