Object.prototype.propertyIsEnumerable()

propertyIsEnumerable()Object 实例的一个方法,它返回一个布尔值,指示指定属性是否为此对象的 可枚举自身 属性。

试一试

语法

js
propertyIsEnumerable(prop)

参数

prop

要测试的属性名称。可以是字符串或 Symbol

返回值

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

描述

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

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

示例

使用 propertyIsEnumerable()

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

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

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

用户定义与内置对象

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

js
const a = ["is enumerable"];

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

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

直接与继承属性

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

js
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()扩展语法 时才有用。有关更多信息,请参阅 属性的可枚举性和所有权

js
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 原型对象一起使用

因为 null 原型对象不继承自 Object.prototype,所以它们不继承 propertyIsEnumerable() 方法。必须使用对象作为 this 调用 Object.prototype.propertyIsEnumerable

js
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(),它还有助于区分不存在的属性和实际不可枚举的属性。

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

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

规范

规范
ECMAScript 语言规范
# sec-object.prototype.propertyisenumerable

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

另请参阅