Reflect.ownKeys 返回一个数组,包含对象自身的全部键名,顺序为:先数字索引升序,再创建顺序的字符串键(含不可枚举),最后创建顺序的 Symbol 键。

Reflect.ownKeys 是获取对象自身所有键名(包括不可枚举属性和 Symbol 属性)最直接、最可靠的方法,它天然覆盖 Object.getOwnPropertyNames 和 Object.getOwnPropertySymbols 的能力,且无需手动合并。
它返回什么?
返回一个数组,包含对象自身的**全部键名**,顺序为:
→ 先按数字索引升序(如 "0", "1", "2")
→ 再按创建顺序的字符串键(包括不可枚举的)
→ 最后是按创建顺序的 Symbol 键
为什么比 Object.keys / Object.getOwnPropertyNames 更全?
-
Object.keys(obj):只返回可枚举的字符串键 -
Object.getOwnPropertyNames(obj):返回所有字符串键(含不可枚举),但**不包含 Symbol** -
Object.getOwnPropertySymbols(obj):只返回 Symbol 键 -
Reflect.ownKeys(obj):一步到位,字符串键(含不可枚举)+ Symbol 键,全都有
实际用法示例
假设有一个对象:
const obj = {};obj.a = 1;
obj.b = 2;
Object.defineProperty(obj, 'c', { value: 3, enumerable: false }); // 不可枚举字符串属性
const sym1 = Symbol('x');
const sym2 = Symbol('y');
obj[sym1] = 'sym1-val';
obj[sym2] = 'sym2-val';
Object.defineProperty(obj, sym2, { enumerable: false }); // Symbol 本身不可枚举性不影响 ownKeys
执行:
console.log(Reflect.ownKeys(obj));输出(顺序固定):
['a', 'b', 'c', Symbol(x), Symbol(y)]注意事项
- 只返回**自身**属性键,不包括原型链上的(这点和
getOwnPropertyNames一致) - Symbol 键无论是否设为
enumerable: false,都会被包含——因为 Symbol 属性天生不可枚举,enumerable对它无效,ownKeys总是包含 - 继承自
Object.prototype的方法(如toString)不会出现,除非你显式在实例上定义了同名不可枚举属性 - Proxy 中可拦截
ownKeys,用于自定义键名暴露逻辑










