一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何用 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 键(无论是否可枚举)全都有

注意事项

  • 只返回自有属性,不会包含原型链上的任何属性(如 toStringconstructor
  • nullundefined 调用会抛出 TypeError,使用前建议做类型检查
  • 对于普通对象、数组、函数等都适用;但对于某些内置对象(如 MathJSON),它们没有自有属性,返回空数组 []
  • 不能直接获取属性值,只是拿到 key 列表;如需值,可配合 obj[key]Object.getOwnPropertyDescriptor()

热门栏目