Reflect.ownKeys 是 JavaScript 中最贴近“原生全量键提取”的方法,能一次性获取对象自身所有属性键(含字符串、数字、Symbol、空格、emoji、中文及控制字符),不走原型链、不过滤、不递归,返回数组支持直接遍历与映射。

Reflect.ownKeys 是 JavaScript 中最贴近“原生全量键提取”的方法——它能一次性拿到对象自身所有属性键(包括字符串、Symbol,甚至不可枚举、非字符串键),不走原型链,也不过滤,特别适合处理键名“稀奇古怪”的对象。
覆盖所有键类型:字符串、数字、Symbol、空格、emoji、中文、控制字符
普通 Object.keys() 只返回可枚举的字符串键;Object.getOwnPropertyNames() 能拿到字符串键(含不可枚举),但漏掉 Symbol;而 Reflect.ownKeys(obj) 一把抓全:
- 字符串键(如
"name"、" "、"?"、"姓名"、"\0") - 数字键(实际转为字符串,如
123→"123") - Symbol 键(如
Symbol("hidden")) - 其他非法标识符字符串(如
"-foo"、"null"、"__proto__")
极速遍历:配合 for...of 或 Array.from 一次到位
返回的是数组,天然支持现代遍历语法,无需额外转换:
- 直接
for (const key of Reflect.ownKeys(obj)) { ... }—— 无中间数组拷贝,性能干净 - 需要映射时用
Reflect.ownKeys(obj).map(key => [key, obj[key]])提取键值对 - 想分离 Symbol 和字符串键?
const symbols = keys.filter(k => typeof k === 'symbol')
应对“稀奇古怪”键的典型场景
比如后端返回的字段含 emoji 或空格,或库生成了私有 Symbol 属性:
- 解析 API 响应:
{"user id": "U001", "✅ status": "ok", [Symbol.for("meta")]: {...}}→Reflect.ownKeys全部捕获 - 调试 Proxy 或类实例时,快速查看所有自有键(含不可枚举的内部标记)
- 做 deep clone 或序列化前,确保不遗漏任何键类型(尤其 Symbol 标记)
注意边界:不递归、不查原型、不自动排序
它只返回对象自身的键,且顺序遵循 JS 规范:先按创建顺序排列整数索引(如 "0"、"1"),再按添加顺序排列其余字符串键,最后是 Symbol 键。若需稳定排序,可显式调用 .sort(),但注意 Symbol 无法直接比较,需单独处理。

















