reflect.ownkeys() 返回对象所有自有属性键名组成的数组,包含可枚举与不可枚举的字符串键及symbol键,按整数索引、字符串键、symbol键的创建顺序排列。

Reflect.ownKeys() 是 ES6 引入的静态方法,专门用于**一次性获取对象所有自有属性键名(keys)**,它能同时返回字符串键和 Symbol 键,并且**不区分可枚举性**——也就是说,无论是 enumerable: true 还是 enumerable: false 的属性,只要属于对象自身(非原型链继承),都会被包含在结果中。
它返回什么?
返回一个数组,元素是该对象所有自有属性的键(key),按以下顺序排列:
- 按创建顺序排列的所有整数索引(如
'0','1'等字符串形式) - 按创建顺序排列的其余字符串键
- 按创建顺序排列的所有Symbol 键
与 Object.keys()、Object.getOwnPropertyNames()、Object.getOwnPropertySymbols() 的区别
对比更清晰:
-
Object.keys(obj)→ 只返回可枚举的字符串键 -
Object.getOwnPropertyNames(obj)→ 返回所有自有字符串键(含不可枚举),但不含 Symbol -
Object.getOwnPropertySymbols(obj)→ 只返回所有自有 Symbol 键 -
Reflect.ownKeys(obj)→ 返回所有自有键:字符串(含不可枚举)+ Symbol,一步到位
实际用法示例
看这段代码就明白:
(注意:不可枚举属性需用Object.defineProperty 显式设置)
const sym1 = Symbol('a');
const sym2 = Symbol('b');
const obj = {
foo: 'bar',
[sym1]: 'symValue'
};
// 添加一个不可枚举的字符串属性
Object.defineProperty(obj, 'hidden', {
value: 'secret',
enumerable: false
});
// 再添加一个不可枚举的 Symbol 属性
Object.defineProperty(obj, sym2, {
value: 'anotherSym',
enumerable: false
});
console.log(Reflect.ownKeys(obj));
// 输出:['foo', 'hidden', Symbol(a), Symbol(b)]
// ✅ 字符串键(无论是否可枚举)+ Symbol 键(无论是否可枚举)全都有
注意事项
- 只返回自有属性,不会包含原型链上的任何属性(如
toString、constructor) - 对
null或undefined调用会抛出TypeError,使用前建议做类型检查 - 对于普通对象、数组、函数等都适用;但对于某些内置对象(如
Math、JSON),它们没有自有属性,返回空数组[] - 不能直接获取属性值,只是拿到 key 列表;如需值,可配合
obj[key]或Object.getOwnPropertyDescriptor()










