Reflect.ownKeys返回对象自身所有键名(含整数索引、其他字符串键和Symbol键)的数组,顺序为:整数索引(数值升序)、其余字符串键(添加顺序)、Symbol键(添加顺序),覆盖可枚举与不可枚举属性,不包含继承属性。

Reflect.ownKeys 用于获取对象**自身所有键名(包括字符串和 Symbol 类型)**,不遍历原型链,也不过滤不可枚举属性 —— 它返回的是对象上“实际存在”的所有自有属性键的完整列表。
它返回什么?
返回一个数组,包含对象自身所有属性键(key),按以下顺序排列:
- 先按创建顺序排列的**整数索引**(即数组式索引,如
"0","1") - 再按添加顺序排列的**其他字符串键**(包括空字符串、负数字符串、非数字字符串等)
- 最后是按声明/添加顺序排列的**Symbol 键**
和 Object.keys / Object.getOwnPropertyNames 的区别
对比更常用的方法:
-
Object.keys(obj):只返回**可枚举的字符串键** -
Object.getOwnPropertyNames(obj):返回**所有字符串键(含不可枚举)**,但不含 Symbol -
Reflect.ownKeys(obj):返回**所有字符串键 + 所有 Symbol 键**(无论是否可枚举)
也就是说,Reflect.ownKeys 是目前最“全量”的自有键获取方式。
基本用法示例
看这个例子:
const sym1 = Symbol('a');
const sym2 = Symbol('b');
const obj = {
[sym1]: 's1',
b: 2,
1: 'one',
0: 'zero',
'-1': 'minus',
a: 1,
};
Object.defineProperty(obj, 'hidden', {
value: 'no enum',
enumerable: false
});
obj[sym2] = 's2';
console.log(Reflect.ownKeys(obj));
// 输出:["0", "1", "-1", "b", "a", "hidden", Symbol(a), Symbol(b)]
注意:"0" 和 "1" 是字符串形式的整数索引,排在最前;"hidden" 虽不可枚举,但仍被包含;两个 Symbol 键在最后。
常见使用场景
- 实现通用的浅拷贝(尤其需保留 Symbol 属性时)
- 代理(Proxy)中拦截
ownKeystrap,自定义键枚举行为 - 调试或序列化工具中完整检查对象结构
- 替代
for...in做更精确的自有属性遍历(避免原型污染干扰)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











