Object.prototype.propertyIsEnumerable()

propertyIsEnumerable() 方法返回一个布尔值,表示指定的属性是否是对象的可枚举自有属性。

尝试一下

语法

js
propertyIsEnumerable(prop)

参数

prop

需要测试的属性名,可以是字符串或 Symbol

返回值

一个布尔值,指示指定的属性是否可枚举并且是对象自有的属性。

描述

所有继承自 Object.prototype(即除了 null 原型对象之外的所有对象)都继承了 propertyIsEnumerable() 方法。该方法判断指定的属性(字符串或 symbol 值)是否是对象的可枚举自有属性。如果对象没有指定的属性,则该方法返回 false

此方法等价于 Object.getOwnPropertyDescriptor(obj, prop)?.enumerable ?? false

示例

使用 propertyIsEnumerable()

以下示例演示了在对象和数组上使用 propertyIsEnumerable()

js
const o = {};
const a = [];
o.prop = "是可枚举的";
a[0] = "是可枚举的";

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

用户自定义对象和内置对象

大多数内置属性默认情况下是不可枚举的,而用户创建的对象属性通常是可枚举的,除非明确指定为不可枚举。

js
const a = ["是可枚举的"];

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

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

自有属性和继承属性

只有可枚举自有属性会令 propertyIsEnumerable() 返回 true,尽管 for...in 循环会访问所有可枚举属性,包括继承的属性。

js
const o1 = {
  enumerableInherited: "是可枚举的",
};
Object.defineProperty(o1, "nonEnumerableInherited", {
  value: "是不可枚举的",
  enumerable: false,
});
const o2 = {
  // o1 是 o2 的原型
  __proto__: o1,
  enumerableOwn: "是可枚举的",
};
Object.defineProperty(o2, "nonEnumerableOwn", {
  value: "是不可枚举的",
  enumerable: false,
});

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

测试 Symbol 属性

propertyIsEnumerable() 也支持 Symbol 属性。请注意,大多数枚举方法只访问字符串属性;当使用 Object.assign()展开语法时,symbol 属性的可枚举性才有用。更多信息,请参见属性的枚举性和所有权

js
const sym = Symbol("可枚举的");
const sym2 = Symbol("不可枚举的");
const o = {
  [sym]: "是可枚举的",
};
Object.defineProperty(o, sym2, {
  value: "是不可枚举的",
  enumerable: false,
});

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

在 null 原型对象上使用

由于 null 原型对象不从 Object.prototype 继承,它们不会继承 propertyIsEnumerable() 方法。你必须使用该对象作为 this 来调用 Object.prototype.propertyIsEnumerable

js
const o = {
  __proto__: null,
  enumerableOwn: "是可枚举的",
};

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

或者,你也可以使用 Object.getOwnPropertyDescriptor(),它也有助于区分不存在的属性和实际上不可枚举的属性。

js
const o = {
  __proto__: null,
  enumerableOwn: "是可枚举的",
};

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

规范

Specification
ECMAScript Language Specification
# sec-object.prototype.propertyisenumerable

浏览器兼容性

BCD tables only load in the browser

参见