object.getownpropertynames 返回对象自身所有字符串键名,包括可枚举和不可枚举属性,但不包含原型链属性和 symbol 键;例如 {a:1} 中定义不可枚举的 b,结果为 ['a','b','c']。

Object.getOwnPropertyNames 可以获取对象**自身所有属性名(包括不可枚举属性)**,但不包含原型链上的属性,也不包含 Symbol 类型的属性。
它能拿到哪些属性?
只返回对象自身的字符串键名,无论该属性是否可枚举:
- 普通可枚举属性(如
a: 1) - 通过
Object.defineProperty设置的enumerable: false属性 - 内置不可枚举属性(如
length在数组上、name在函数上)
它不能拿到哪些属性?
以下几类属性不会出现在结果中:
- 原型链上的任何属性(即使可枚举)
- Symbol 类型的键(要用
Object.getOwnPropertySymbols获取) - 继承来的属性(比如从
Object.prototype来的toString)
对比其他类似方法
理解差异有助于正确使用:
-
Object.keys(obj):只返回自身可枚举的字符串键 -
Object.getOwnPropertyNames(obj):返回自身所有字符串键(含不可枚举) -
Object.getOwnPropertySymbols(obj):返回自身所有 Symbol 键 -
Reflect.ownKeys(obj):返回所有自身键(字符串 + Symbol),最全
简单示例说明
看这段代码:
const obj = { a: 1 };
Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
Object.defineProperty(obj, 'c', { value: 3, enumerable: true });
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'b', 'c']
console.log(Object.keys(obj)); // ['a', 'c']
可以看到,b 虽然不可枚举,仍被 getOwnPropertyNames 捕获。











