object.getownpropertynames 返回对象自身所有属性名(含不可枚举,不含symbol)的字符串数组;它不访问原型链,区别于仅返回可枚举属性的 object.keys 和遍历原型链的 for...in。

Object.getOwnPropertyNames 能获取对象自身(不含原型链)的所有可枚举和不可枚举的属性名,返回一个字符串数组。
获取对象自身的全部属性名(包括不可枚举的)
它不访问原型链,只检查目标对象本身定义的属性,无论是否可枚举。比如 Object.defineProperty 设置的 enumerable: false 属性也会被列出。
- 语法:
Object.getOwnPropertyNames(obj) - 返回值:字符串数组,元素是属性名(不含 Symbol)
- 注意:不会返回 Symbol 类型的属性(要用
Object.getOwnPropertySymbols)
对比 for...in 和 Object.keys
for...in 和 Object.keys() 都只返回可枚举属性,且 for...in 还会遍历原型链上的可枚举属性;而 Object.getOwnPropertyNames 既包含不可枚举属性,又严格限定在对象自身。
-
Object.keys(obj)→ 自身可枚举属性名 -
for...in→ 自身 + 原型链上所有可枚举属性名 -
Object.getOwnPropertyNames(obj)→ 自身所有属性名(可枚举 + 不可枚举)
实际用法示例
例如定义一个带不可枚举属性的对象:
const obj = { a: 1 };
Object.defineProperty(obj, 'b', {
value: 2,
enumerable: false
});
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'b']
console.log(Object.keys(obj)); // ['a']
再比如内置对象:Object.getOwnPropertyNames(Date) 会返回 ['parse', 'UTC', 'now', 'prototype'] 等自身静态属性名。
配合 getOwnPropertyDescriptor 深入查看属性特性
拿到属性名后,可用 Object.getOwnPropertyDescriptor 查看每个属性的详细配置(如 writable、configurable、enumerable)。
- 例如:
Object.getOwnPropertyDescriptor(obj, 'b')返回{ value: 2, writable: false, enumerable: false, configurable: false } - 适合调试、深拷贝、属性代理等需要精确控制的场景











