reflect.ownkeys用于一次性获取对象自身所有属性键(含字符串键和symbol键),返回按创建顺序排列的数组,包括整数索引键、其他字符串键和symbol键,不区分可枚举性且不包含继承属性。

Reflect.ownKeys 就是专为这个目的设计的:一步获取对象自身所有属性键(包括字符串键和 Symbol 键),且**不区分是否可枚举、是否为继承属性**——它只关心“自己有的”,不关心“能不能遍历”。
它返回什么?
返回一个数组,包含对象自身所有属性的键名,按以下顺序:
- 按创建顺序排列的**整数索引键**(如 '0', '1' 等,即使它们是字符串形式)
- 按创建顺序排列的**其他字符串键**(普通属性名,如 'name', 'age')
- 按创建顺序排列的**Symbol 键**(无论是否通过 Symbol.for 共享)
和 Object.keys / Object.getOwnPropertyNames / Object.getOwnPropertySymbols 的区别
不用拼接、不用三次调用:
- Object.keys(obj) → 只返回可枚举的字符串键
- Object.getOwnPropertyNames(obj) → 返回所有字符串键(含不可枚举),但漏掉 Symbol
- Object.getOwnPropertySymbols(obj) → 只返回 Symbol 键
- Reflect.ownKeys(obj) → 一次性全拿下,字符串 + Symbol,不管枚举性
实际用法示例
比如这个对象:
const obj = {
a: 1,
[Symbol('b')]: 2
};
Object.defineProperty(obj, 'c', { value: 3, enumerable: false });
obj[Symbol.for('d')] = 4;
执行:
Reflect.ownKeys(obj) → ['a', 'c', Symbol(b), Symbol(d)]
注意:'c' 虽不可枚举,仍被包含;两个 Symbol 都在,无论是否用 Symbol.for 创建。
注意事项
- 只返回**自身属性**,不包含原型链上的任何键
- 不会触发 getter,只是静态读取键名列表
- 对 null/undefined 抛 TypeError,使用前建议做类型检查
- Proxy 对象中可被 trap 拦截,行为由 handler.ownKeys 决定











