能,reflect.ownkeys可获取对象所有自有属性键名,包括可枚举/不可枚举的字符串键和symbol键,不遗漏、不筛选,严格按创建顺序返回字符串键在前、symbol键在后。

Reflect.ownKeys 能否拿到 Symbol 属性?
能,而且这是它和 Object.keys、Object.getOwnPropertyNames 的关键区别:它会返回所有自有属性的键(包括字符串和 Symbol),不忽略任何类型。
为什么 Object.keys 拿不到 Symbol 属性?
Object.keys 只返回可枚举的字符串键;Object.getOwnPropertyNames 返回所有字符串键(含不可枚举),但依然过滤掉 Symbol;只有 Reflect.ownKeys 无差别收集全部自有键。
- 业务对象中用
Symbol('id')作私有字段?它会被包含 - 用了
Symbol.for('cache')全局 Symbol?也会被包含 - 继承来的属性?不会——
Reflect.ownKeys只查自身,不查原型链
实际使用时要注意哪些边界?
它返回的是键的数组,但顺序有隐含规则:先按创建顺序返回所有字符串键(包括不可枚举的),再按创建顺序返回所有 Symbol 键。这个顺序在 V8 和 SpiderMonkey 中一致,但规范未强制,别依赖排序做逻辑判断。
- 如果对象有
Object.defineProperty(obj, 'a', { enumerable: false }),'a'仍会出现在结果里 - 如果对象是数组,
Reflect.ownKeys([1,2])返回['0', '1', 'length'],不含 Symbol(除非你手动加了) - Proxy 对象需确保 handler 的
ownKeystrap 正确返回,否则可能被拦截或降级
const sym = Symbol('uid');
const user = { name: 'Alice' };
user[sym] = 'abc123';
Reflect.ownKeys(user); // ['name', Symbol(uid)]
想过滤出 Symbol 属性怎么办?
直接用 typeof 判断即可,不需要额外 API:
Reflect.ownKeys(obj).filter(k => typeof k === 'symbol')- 注意:不能用
k instanceof Symbol,因为 Symbol 值不是对象实例 - 如果要区分全局 Symbol(
Symbol.for)和局部 Symbol,得靠Symbol.keyFor(k),但它对局部 Symbol 返回undefined
Reflect.ownKeys 虽然能列出来,但后续操作若没显式处理 Symbol 类型键,很容易引发 Cannot convert a Symbol to a string 这类错误。










