Spec-Zone.ru › JavaScript

Object.prototype.propertyIsEnumerable()

Baseline Широко доступно

Эта функция хорошо зарекомендовала себя и работает на множестве устройств и версий браузеров. Она доступна во всех браузерах с июля 2015 года.

Метод propertyIsEnumerable() экземпляров Object возвращает булево значение, указывающее, является ли указанное свойство перечисляемым собственным свойством этого объекта.

Попробуйте

const object = {};
const array = [];
object.foo = 42;
array[0] = 42;

console.log(object.propertyIsEnumerable("foo"));
// Expected output: true

console.log(array.propertyIsEnumerable(0));
// Expected output: true

console.log(array.propertyIsEnumerable("length"));
// Expected output: false

Синтаксис

propertyIsEnumerable(prop)

Параметры

prop
Имя проверяемого свойства. Может быть строкой или Symbol.

Возвращаемое значение

Булево значение, указывающее, является ли указанное свойство перечисляемым и собственным свойством объекта.

Описание

Все объекты, унаследованные от Object.prototype (то есть все, кроме объектов null-прототипа), наследуют метод propertyIsEnumerable(). Этот метод определяет, является ли указанное свойство (строка или символ) перечисляемым собственным свойством объекта. Если у объекта нет указанного свойства, этот метод возвращает false.

Этот метод эквивалентен Object.getOwnPropertyDescriptor(obj, prop)?.enumerable ?? false.

Примеры

Использование propertyIsEnumerable()

Следующий пример демонстрирует использование propertyIsEnumerable() на объектах и массивах.

const o = {};
const a = [];
o.prop = "is enumerable";
a[0] = "is enumerable";

o.propertyIsEnumerable("prop"); // true
a.propertyIsEnumerable(0); // true

Пользовательские vs. встроенные объекты

Большинство встроенных свойств по умолчанию не перечисляются, в то время как пользовательские свойства объектов часто перечисляются, если явно не указано иное.

const a = ["is enumerable"];

a.propertyIsEnumerable(0); // true
a.propertyIsEnumerable("length"); // false

Math.propertyIsEnumerable("random"); // false
globalThis.propertyIsEnumerable("Math"); // false

Прямые vs. унаследованные свойства

Только перечисляемые собственные свойства заставляют propertyIsEnumerable() возвращать true, хотя все перечисляемые свойства, включая унаследованные, посещаются циклом for...in.

const o1 = {
  enumerableInherited: "is enumerable",
};
Object.defineProperty(o1, "nonEnumerableInherited", {
  value: "is non-enumerable",
  enumerable: false,
});
const o2 = {
  // o1 is the prototype of o2
  __proto__: o1,
  enumerableOwn: "is enumerable",
};
Object.defineProperty(o2, "nonEnumerableOwn", {
  value: "is non-enumerable",
  enumerable: false,
});

o2.propertyIsEnumerable("enumerableInherited"); // false
o2.propertyIsEnumerable("nonEnumerableInherited"); // false
o2.propertyIsEnumerable("enumerableOwn"); // true
o2.propertyIsEnumerable("nonEnumerableOwn"); // false

Тестирование свойств символов

Свойства Symbol также поддерживаются propertyIsEnumerable(). Обратите внимание, что большинство методов перечисления посещают только строковые свойства; перечисляемость свойств символов полезна только при использовании Object.assign() или оператора расширения. Дополнительную информацию см. в разделе Перечисляемость и владение свойствами.

const sym = Symbol("enumerable");
const sym2 = Symbol("non-enumerable");
const o = {
  [sym]: "is enumerable",
};
Object.defineProperty(o, sym2, {
  value: "is non-enumerable",
  enumerable: false,
});

o.propertyIsEnumerable(sym); // true
o.propertyIsEnumerable(sym2); // false

Использование с объектами null-prototype

Поскольку объекты null-прототипа не наследуются от Object.prototype, они не наследуют метод propertyIsEnumerable(). Вместо этого вы должны вызывать Object.prototype.propertyIsEnumerable, передавая объект как this.

const o = {
  __proto__: null,
  enumerableOwn: "is enumerable",
};

o.propertyIsEnumerable("enumerableOwn"); // TypeError: o.propertyIsEnumerable is not a function
Object.prototype.propertyIsEnumerable.call(o, "enumerableOwn"); // true

Альтернативно, вы можете использовать Object.getOwnPropertyDescriptor(), который также помогает различать несуществующие свойства и реально неперечисляемые свойства.

const o = {
  __proto__: null,
  enumerableOwn: "is enumerable",
};

Object.getOwnPropertyDescriptor(o, "enumerableOwn")?.enumerable; // true
Object.getOwnPropertyDescriptor(o, "nonExistent")?.enumerable; // undefined

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

Спецификация
Спецификация языка ECMAScript® 2027
# sec-object.prototype.propertyisenumerable

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

Настольные компьютеры Мобильные устройства Сервер
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
propertyIsEnumerable
1
12
1
4
3
18
4
10.1
1
1.0
1
1
1.0.0
1.0
0.10.0

См. также

  • Перечисляемость и владение свойствами
  • for...in
  • Object.keys()
  • Object.defineProperty()

© 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/propertyIsEnumerable

Spec-Zone.ru

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