propertyIsEnumerable用于判断指定属性是否为对象自身的可枚举属性;它只检查自有属性,不查原型链,且仅当[[Enumerable]]为true时返回true。

propertyIsEnumerable 是 JavaScript 中对象原型上的一个方法,用于判断**指定属性是否为该对象自身的、可枚举的属性**。它只检查**自有属性(own property)**,不查找原型链上的属性,且只对 enumerable: true 的属性返回 true。
基本用法和返回值
调用方式:obj.propertyIsEnumerable(propName),参数是字符串形式的属性名。
- 返回
true:该属性存在于对象自身,且[[Enumerable]]内部特性为true - 返回
false:属性不存在、是继承来的、或enumerable为false
常见场景与对比
它和 hasOwnProperty、in 操作符有明显区别:
-
obj.hasOwnProperty('x'):只看是否为自有属性,不关心是否可枚举 -
'x' in obj:包括继承属性,也不管是否可枚举 -
obj.propertyIsEnumerable('x'):必须同时满足「自有 + 可枚举」
例如:
立即学习“Java免费学习笔记(深入)”;
const obj = { a: 1 };
Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
Object.defineProperty(obj, 'c', { value: 3, enumerable: true });
console.log(obj.propertyIsEnumerable('a')); // true(默认可枚举)
console.log(obj.propertyIsEnumerable('b')); // false(自有但不可枚举)
console.log(obj.propertyIsEnumerable('c')); // true(显式设为可枚举)
console.log(obj.propertyIsEnumerable('toString')); // false(继承自 Object.prototype,非自有)
实际使用建议
这个方法在需要精确控制属性遍历行为时很有用,比如实现自定义的浅拷贝、序列化过滤、或调试属性状态:
- 配合
Object.keys()或for...in做校验:前者只返回可枚举自有属性,后者还会包含继承的可枚举属性;propertyIsEnumerable可帮你确认某个特定属性是否会被它们捕获 - 避免误判:不要用它检测原型链上的属性——它永远返回
false,哪怕那个属性可枚举 - 注意数组索引:数组的数字索引属性默认可枚举,所以
arr.propertyIsEnumerable(0)通常为true;但数组长度(length)也是可枚举的自有属性
兼容性与替代写法
该方法自 ES3 起就存在,所有现代浏览器和 Node.js 环境都支持,无需 polyfill。
如果想手动模拟逻辑(仅作理解参考),等价于:
function isOwnEnumerable(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop) &&
Object.getOwnPropertyDescriptor(obj, prop)?.enumerable === true;
}


















