Object.hasOwn()
Базовый уровень Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с марта 2022 года.
Статический метод Object.hasOwn() возвращает true, если указанный объект имеет указанное свойство как собственное свойство. Если свойство унаследовано или не существует, метод возвращает false.
Примечание: Object.hasOwn() предназначен в качестве замены для Object.prototype.hasOwnProperty().
Попробовать
const object = {
prop: "exists",
};
console.log(Object.hasOwn(object, "prop"));
// Expected output: true
console.log(Object.hasOwn(object, "toString"));
// Expected output: false
console.log(Object.hasOwn(object, "undeclaredPropertyValue"));
// Expected output: false
Синтаксис
Object.hasOwn(obj, prop)
Параметры
-
obj - Экземпляр объекта JavaScript для проверки.
-
prop - Имя
Stringили Symbol свойства для проверки.
Возвращаемое значение
true, если указанный объект напрямую определил указанное свойство. В противном случае false
Описание
Метод Object.hasOwn() возвращает true, если указанное свойство является прямым свойством объекта — даже если значение свойства null или undefined. Метод возвращает false, если свойство унаследовано или вообще не было объявлено. В отличие от оператора in, этот метод не проверяет указанное свойство в цепочке прототипов объекта.
Он рекомендуется вместо Object.prototype.hasOwnProperty(), потому что он работает для null-прототипных объектов и с объектами, которые переопределили унаследованный метод hasOwnProperty(). Хотя можно обойти эти проблемы, обращаясь к Object.prototype.hasOwnProperty() на другом объекте (например, Object.prototype.hasOwnProperty.call(obj, prop), Object.hasOwn() является более интуитивным и лаконичным.
Примеры
Использование Object.hasOwn() для проверки существования свойства
Следующий код показывает, как определить, содержит ли объект example свойство с именем prop.
const example = {};
Object.hasOwn(example, "prop"); // false - 'prop' has not been defined
example.prop = "exists";
Object.hasOwn(example, "prop"); // true - 'prop' has been defined
example.prop = null;
Object.hasOwn(example, "prop"); // true - own property exists with value of null
example.prop = undefined;
Object.hasOwn(example, "prop"); // true - own property exists with value of undefined
Прямые свойства против унаследованных свойств
Следующий пример показывает различие между прямыми свойствами и свойствами, унаследованными через цепочку прототипов:
const example = {};
example.prop = "exists";
// `hasOwn` will only return true for direct properties:
Object.hasOwn(example, "prop"); // true
Object.hasOwn(example, "toString"); // false
Object.hasOwn(example, "hasOwnProperty"); // false
// The `in` operator will return true for direct or inherited properties:
"prop" in example; // true
"toString" in example; // true
"hasOwnProperty" in example; // true
Итерация по свойствам объекта
Для итерации по перечисляемым свойствам объекта вы должны использовать:
const example = { foo: true, bar: true };
for (const name of Object.keys(example)) {
// …
}
Но если вам нужно использовать for...in, вы можете использовать Object.hasOwn(), чтобы пропустить унаследованные свойства:
const example = { foo: true, bar: true };
for (const name in example) {
if (Object.hasOwn(example, name)) {
// …
}
}
Проверка существования индекса массива
Элементы Array определены как прямые свойства, поэтому вы можете использовать метод hasOwn() для проверки того, существует ли конкретный индекс:
const fruits = ["Apple", "Banana", "Watermelon", "Orange"];
Object.hasOwn(fruits, 3); // true ('Orange')
Object.hasOwn(fruits, 4); // false - not defined
Проблемные случаи для hasOwnProperty()
В этом разделе показано, что Object.hasOwn() невосприимчив к проблемам, которые затрагивают hasOwnProperty(). Во-первых, его можно использовать с объектами, которые повторно реализовали hasOwnProperty(). В приведенном ниже примере, повторно реализованный метод hasOwnProperty() сообщает false для каждого свойства, но поведение Object.hasOwn() остается неизменным:
const foo = {
hasOwnProperty() {
return false;
},
bar: "The dragons be out of office",
};
console.log(foo.hasOwnProperty("bar")); // false
console.log(Object.hasOwn(foo, "bar")); // true
Его также можно использовать с null-прототипными объектами. Они не наследуют от Object.prototype, и поэтому hasOwnProperty() недоступен.
const foo = Object.create(null);
foo.prop = "exists";
console.log(foo.hasOwnProperty("prop"));
// Uncaught TypeError: foo.hasOwnProperty is not a function
console.log(Object.hasOwn(foo, "prop")); // true
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
hasOwn |
93 |
93 |
92 |
79 |
15.4 |
93 |
92 |
66 |
15.4 |
17.0 |
93 |
15.4 |
1.0.0 |
1.13 |
16.9.0 |
Смотрите также
- Полифилл
Object.hasOwnвcore-js - Полифилл es-shims
Object.hasOwn Object.prototype.hasOwnProperty()- Перечисляемость и принадлежность свойств
Object.getOwnPropertyNames()for...inin- Наследование и цепочка прототипов
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn