Object.keys返回对象自身可枚举的字符串键,Object.getOwnPropertyNames返回所有字符串键(含不可枚举),二者均不包含Symbol键和原型链属性;Reflect.ownKeys等价于三者并集,覆盖全部自有键。

Object.keys 和 Object.getOwnPropertyNames 都用来获取对象自身的属性名,但它们筛选的范围不同:前者只返回可枚举(enumerable: true)的字符串键,后者返回所有字符串键——无论是否可枚举。
Object.keys 只抓“能被遍历到”的属性
它返回一个字符串数组,包含对象自身、且 enumerable === true 的所有属性名。日常开发中处理表单、配置对象、JSON 数据时基本都用它,因为这些场景通常只关心“正常可见”的字段。
- 不包括不可枚举属性(比如用
Object.defineProperty设置了enumerable: false的属性) - 不包括原型链上的属性(如
toString、hasOwnProperty) - 也不包括 Symbol 类型的键,哪怕它是可枚举的
- 行为等价于
for...in + hasOwnProperty的组合
Object.getOwnPropertyNames 拿全“自己定义的”字符串键
它返回对象自身所有字符串属性名,不管 enumerable 是 true 还是 false。适合需要完整掌控属性列表的场景,比如调试、深拷贝实现、白名单校验或序列化逻辑。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 能拿到
constructor、toString等内置不可枚举方法(在普通对象上少见,但在某些内置对象或手动定义后会出现) - 也能拿到你用
Object.defineProperty显式设为不可枚举的属性 - 依然不包含 Symbol 键,也不包含原型链上的任何属性
想拿齐所有自有键?得拼三个方法
如果既要字符串键又要 Symbol 键,且都要“自身”的(不含继承),就得把三者结果合并:
立即学习“Java免费学习笔记(深入)”;
-
Object.keys(obj)→ 可枚举字符串键 -
Object.getOwnPropertyNames(obj)→ 所有字符串键 -
Object.getOwnPropertySymbols(obj)→ 所有 Symbol 键(无论是否可枚举)
去重后就是最完整的自有键列表。而 Reflect.ownKeys(obj) 实际就等于这三者的并集,是更简洁的一站式方案。

















