Object.prototype.propertyIsEnumerable()
试一试
语法
js
propertyIsEnumerable(prop)
参数
返回值
一个布尔值,指示指定属性是否可枚举且是对象的自有属性。
描述
所有继承自 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 的浏览器中加载。