Reflect.ownKeys是获取对象所有自有属性键名(含字符串和Symbol)最完整的方法,严格返回[[OwnPropertyKeys]]中定义的全部键,按创建顺序排列,不区分可枚举性,也不遗漏Symbol。

Reflect.ownKeys 是获取对象**所有自有属性键名**(包括字符串和 Symbol 类型)最直接、最完整的方法,它不区分属性是否可枚举,也不过滤 Symbol,天然支持两者。
为什么 Reflect.ownKeys 能拿到 Symbol 属性?
因为它的设计目标就是返回对象**全部自有属性的键(keys)**,严格按属性在内部属性 [[OwnPropertyKeys]] 中的顺序返回:先字符串键(按创建顺序),再 Symbol 键(也按创建顺序)。这与 Object.keys(只返回可枚举字符串键)、Object.getOwnPropertyNames(返回所有字符串键,不含 Symbol)形成明确区分。
基本用法:一步获取全部自有键
直接传入目标对象即可:
const obj = {
a: 1,
b: 2
};
obj[Symbol('x')] = 'symX';
obj[Symbol('y')] = 'symY';
console.log(Reflect.ownKeys(obj));
// ['a', 'b', Symbol(x), Symbol(y)]
常见搭配与注意事项
- 返回结果是数组,元素类型混合(
string和symbol),遍历时建议用typeof key === 'symbol'判断类型 - 只返回**自有属性**,不包含原型链上的属性(这点和
Object.getOwnPropertyNames一致) - 不会触发 getter,只是读取键名列表,不访问属性值
- 对不可扩展对象、冻结对象同样有效;对 null/undefined 抛出 TypeError,使用前建议加判断
对比其他方法(快速分辨该用谁)
-
Object.keys(obj)→ 只要可枚举的字符串键 -
Object.getOwnPropertyNames(obj)→ 所有字符串键(含不可枚举),但不含 Symbol -
Object.getOwnPropertySymbols(obj)→ 只要 Symbol 键(自有) -
Reflect.ownKeys(obj)→ 字符串 + Symbol,全部自有键,无遗漏










