reflect.ownkeys() 是获取对象所有自有属性键名(含字符串和 symbol,无论是否可枚举)的最完整方法,返回按创建顺序排列的数组,不包含继承属性,对 null/undefined 抛出 typeerror。

Reflect.ownKeys() 是获取对象自有属性键名的正确方法。
Reflect.ownKeys() 返回所有自有属性键名
它返回一个包含对象所有自有属性(包括字符串和 Symbol 类型)键名的数组,不包括继承属性,也不受 enumerable 限制。
- 涵盖可枚举与不可枚举属性(如
Object.defineProperty设置的enumerable: false属性) - 同时返回字符串键和 Symbol 键
- 返回顺序:先按创建顺序返回整数索引(类似数组下标),再按创建顺序返回其余字符串键,最后是 Symbol 键
对比 Object.keys() 和 Object.getOwnPropertyNames()
Object.keys() 只返回可枚举的字符串键;Object.getOwnPropertyNames() 返回所有字符串键(不含 Symbol);而 Reflect.ownKeys() 最完整——字符串 + Symbol,且不管是否可枚举。
const obj = { a: 1 };
Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
obj[Symbol('c')] = 3;
console.log(Reflect.ownKeys(obj)); // ['a', 'b', Symbol(c)]
实际使用注意点
它只作用于对象本身,不遍历原型链。若需递归获取,需手动处理原型(但通常“自有”即指自身)。
- 对 null 或 undefined 会抛出 TypeError,使用前建议校验类型
- 对普通对象、数组、函数、Date 等内置对象都适用
- 不能替代 for...in(后者包含原型链上可枚举属性)
配合其他 Reflect 方法更安全地操作属性
获取键名后,常配合 Reflect.getOwnPropertyDescriptor() 判断属性特性,或用 Reflect.has() 检查是否存在:
const keys = Reflect.ownKeys(obj);
keys.forEach(key => {
const desc = Reflect.getOwnPropertyDescriptor(obj, key);
console.log(key, desc?.enumerable); // 查看是否可枚举
});Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











