最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何用 Reflect.ownKeys() 获取对象所有的自有属性:包括 Symbol 与不可枚举属性
时间:2026-06-30 11:17:51 编辑:袖梨 来源:一聚教程网
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()