Spec-Zone.ru › JavaScript

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

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-object.hasown

Совместимость с браузерами

Десктопные Мобильные Серверные
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...in
  • in
  • Наследование и цепочка прототипов

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API