reflect.ownkeys() 返回一个数组,包含对象自身所有键名,顺序为:整数索引(数值升序)、其余字符串键(添加顺序)、symbol 键(添加顺序)。

Reflect.ownKeys() 是 ES6 引入的静态方法,用于**获取对象自身所有可枚举和不可枚举的键名(包括字符串和 Symbol 类型)**,不包括原型链上的属性。
它返回什么?
返回一个数组,包含对象自身的所有键名(按以下顺序):
- 所有整数索引(按数值升序,如
"0","1","2") - 其余字符串键名(按添加顺序)
- 所有Symbol 键名(按添加顺序)
和 Object.keys()、Object.getOwnPropertyNames() 的区别?
对比更清晰:
-
Object.keys(obj)→ 只返回可枚举的字符串键 -
Object.getOwnPropertyNames(obj)→ 返回所有字符串键(可枚举 + 不可枚举),但不含 Symbol -
Reflect.ownKeys(obj)→ 返回所有键(字符串 + Symbol,可枚举 + 不可枚举),是三者中覆盖最全的
实际用法示例
看这段代码:
const sym1 = Symbol('a');
const sym2 = Symbol('b');
const obj = {
[sym1]: 'sym1 value',
b: 'string b',
1: 'index 1',
0: 'index 0',
[sym2]: 'sym2 value'
};
Object.defineProperty(obj, 'c', {
value: 'hidden c',
enumerable: false
});
console.log(Reflect.ownKeys(obj));
// 输出:["0", "1", "b", "c", Symbol(a), Symbol(b)]
注意:"0" 和 "1" 被识别为索引,排在最前且升序;"b" 和 "c" 是字符串键("c" 不可枚举但依然被包含);两个 Symbol 按定义顺序排在最后。
注意事项
- 只遍历对象自身的属性,不会访问原型链(如
toString等继承方法不会出现) - 如果传入非对象(如
null或原始值),会抛出TypeError - 对于数组,会返回数字索引 + 其他自有属性(比如手动添加的
arr.custom = true)










