object.getownpropertynames() 返回对象所有自身属性名,无论 enumerable 为 true 或 false;它只判断是否为自有属性,不关心可枚举性,而 object.keys() 等遍历方法仅返回 enumerable: true 的属性。

Object.getOwnPropertyNames() 完全不受 enumerable 属性影响。 无论一个属性的 enumerable 是 true 还是 false,只要它是对象自身的属性(不来自原型链),Object.getOwnPropertyNames() 就会把它列出来。
它只关心“是不是自身属性”,不看“能不能被遍历”
可枚举性(enumerable)控制的是属性是否出现在 for...in、Object.keys() 或 JSON.stringify() 这类“遍历型”操作中。而 Object.getOwnPropertyNames() 的设计目标就是获取“所有自有属性名”,和遍历无关。
- 默认通过字面量或赋值创建的属性:
enumerable为true→ 会被Object.getOwnPropertyNames()返回 - 用
Object.defineProperty()显式设为enumerable: false的属性 → 同样会被Object.getOwnPropertyNames()返回 - 内置不可枚举属性(如数组的
length、函数的name)→ 也会出现在返回结果中
对比其他方法,更能看清它的定位
同一个对象上,不同方法对不可枚举属性的处理差异明显:
-
Object.keys(obj):只返回enumerable: true的自有属性 -
for...in obj:返回自身 + 原型链上所有enumerable: true的属性 -
Object.getOwnPropertyNames(obj):返回所有自有属性名,不管enumerable值 -
Reflect.ownKeys(obj):和Object.getOwnPropertyNames()类似,但还包含Symbol键
怎么验证?简单写两行就能看到
比如定义一个带不可枚举属性的对象:
const obj = { a: 1 };Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
console.log(Object.keys(obj)); // ['a']
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'b']
结果清楚表明:b 虽然不可枚举,但仍被 Object.getOwnPropertyNames() 捕获。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











