Reflect.ownKeys() 返回对象所有自有属性键名组成的数组,包含可枚举与不可枚举的字符串键及Symbol键,按整数索引、字符串键、Symbol键的创建顺序排列。
Reflect.ownKeys() 是 ES6 引入的静态方法,专门用于**一次性获取对象所有自有属性键名(keys)**,它能同时返回字符串键和 Symbol 键,并且**不区分可枚举性**——也就是说,无论是 enumerable: true 还是 enumerable: false 的属性,只要属于对象自身(非原型链继承),都会被包含在结果中。
返回一个数组,元素是该对象所有自有属性的键(key),按以下顺序排列:
'0', '1' 等字符串形式)对比更清晰:
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),它们没有自有属性,返回空数组 []
obj[key] 或 Object.getOwnPropertyDescriptor()