Object.hasOwn() проверяет, есть ли у объекта собственное свойство.
Это современный и более безопасный вариант по сравнению с hasOwnProperty().
Синтаксис
Object.hasOwn(obj, propertyName)
obj - объект, который нужно проверить.
propertyName - имя свойства.
Что делает Object.hasOwn()
Если свойство принадлежит самому объекту, метод вернёт true.
const user = {
name: "Anna",
};
console.log(Object.hasOwn(user, "name")); // true
console.log(Object.hasOwn(user, "age")); // false
Что возвращает Object.hasOwn()
Object.hasOwn() всегда возвращает булево значение:
true, если свойство есть у самого объектаfalse, если такого собственного свойства нет
const user = { name: "Anna" };
console.log(Object.hasOwn(user, "name")); // true
console.log(Object.hasOwn(user, "role")); // false
Только собственные свойства
Метод проверяет только собственные свойства объекта.
Свойства из прототипа в результат не входят.
const base = { role: "user" };
const person = Object.create(base);
person.name = "Anna";
console.log(Object.hasOwn(person, "name")); // true
console.log(Object.hasOwn(person, "role")); // false
Хотя person.role доступно, это свойство пришло из прототипа.
Object.hasOwn() и оператор 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(Object.hasOwn(person, "name")); // true
console.log(Object.hasOwn(person, "role")); // false
in проверяет и собственные, и наследуемые свойства.
Object.hasOwn() проверяет только собственные.
Если значение равно undefined
Метод проверяет наличие свойства, а не его значение.
const settings = {
theme: undefined,
};
console.log(Object.hasOwn(settings, "theme")); // true
console.log(settings.theme); // undefined
То есть undefined не означает, что свойства нет.
Object.hasOwn() и hasOwnProperty()
По смыслу эти методы очень похожи:
const user = { name: "Anna" };
console.log(user.hasOwnProperty("name")); // true
console.log(Object.hasOwn(user, "name")); // true
Но Object.hasOwn() удобнее и безопаснее.
Почему Object.hasOwn() безопаснее
У объекта может быть собственное свойство с именем hasOwnProperty.
const obj = {
hasOwnProperty: "test",
name: "Anna",
};
// obj.hasOwnProperty("name"); // Ошибка
Object.hasOwn() в такой ситуации продолжает работать нормально:
console.log(Object.hasOwn(obj, "name")); // true
Object.create(null)
У объекта без прототипа метода hasOwnProperty() вообще нет.
const dict = Object.create(null);
dict.name = "Anna";
console.log(Object.hasOwn(dict, "name")); // true
Это одна из причин, почему Object.hasOwn() удобно использовать в новом коде.
Массивы и Object.hasOwn()
Массив тоже является объектом, поэтому метод работает и с ним.
const arr = ["a", "b"];
console.log(Object.hasOwn(arr, 0)); // true
console.log(Object.hasOwn(arr, 2)); // false
Для массива индексы тоже считаются свойствами.
Когда это полезно
Object.hasOwn() удобно использовать, когда:
- нужно проверить, есть ли ключ у самого объекта
- нужно отличить собственное свойство от наследуемого
- объект может быть создан через
Object.create(null) - хочется использовать более современный и безопасный способ проверки
Пример:
const config = {
lang: "ru",
};
if (Object.hasOwn(config, "lang")) {
console.log("Ключ lang есть");
}
Object.hasOwn() не меняет объект
Метод только проверяет наличие свойства и не изменяет сам объект.
const user = { name: "Anna" };
const result = Object.hasOwn(user, "name");
console.log(user); // { name: "Anna" }
console.log(result); // true
Частые ошибки
Путать Object.hasOwn() и in
const base = { role: "user" };
const person = Object.create(base);
console.log(Object.hasOwn(person, "role")); // false
console.log("role" in person); // true
Это разные проверки.
Считать, что undefined означает отсутствие свойства
const obj = { value: undefined };
console.log(Object.hasOwn(obj, "value")); // true
Свойство есть, просто его значение равно undefined.
Думать, что метод работает только с обычными объектами
const arr = ["a", "b"];
console.log(Object.hasOwn(arr, 0)); // true
Метод работает и с массивами.
Быстрая памятка
Object.hasOwn()проверяет только собственные свойства объекта- свойства из прототипа в результат не входят
- метод возвращает
trueилиfalse - он безопаснее, чем
hasOwnProperty() - особенно удобен для объектов без прототипа
Коротко
Object.hasOwn() - это современный способ проверить, принадлежит ли свойство самому объекту. Главное, что стоит запомнить: метод не смотрит в прототип и удобнее, чем hasOwnProperty(), потому что работает безопасно даже в сложных случаях.