Object.getOwnPropertySymbols() 专门获取对象自身所有 Symbol 键名,包括自定义 Symbol、规范预定义知名 Symbol(如 Symbol.iterator)及框架私有 Symbol(如 React 的 $$typeof),不包含原型链上的 Symbol,也不受可枚举性或配置性影响。

Object.getOwnPropertySymbols() 是专门用来获取对象自身所有 Symbol 类型键名的工具,它不关心属性是否可枚举、是否被冻结,只专注“Symbol 键 + 自身拥有”这两个条件。它常被用于调试、框架开发或与 Symbol 内置规范(如迭代协议、类型转换)打交道的场景。
它能拿到哪些 Symbol 属性?
只要该 Symbol 是直接定义在目标对象上(而非原型链上),且是作为属性键使用,Object.getOwnPropertySymbols() 就能列出它。包括:
- 你自己用
Symbol()或Symbol.for()创建并赋值的属性,例如obj[Symbol('id')] = 123 - ES6+ 规范预定义的知名 Symbol(Well-known Symbols),比如:
obj[Symbol.iterator]、obj[Symbol.toStringTag]、obj[Symbol.hasInstance]等 - 第三方库或框架手动挂载的 Symbol 属性(如 React 的
$$typeof、Vue 的__v_isRef)
它和 Object.keys() / Object.getOwnPropertyNames() 有什么区别?
三者覆盖范围不同,容易混淆:
-
Object.keys(obj):只返回自身可枚举的 字符串键(不含 Symbol,也不含不可枚举字符串键) -
Object.getOwnPropertyNames(obj):返回自身所有 字符串键(无论是否可枚举),仍 不包含任何 Symbol -
Object.getOwnPropertySymbols(obj):只返回自身所有 Symbol 键(无论是否可枚举)
想完整遍历对象所有自有属性(字符串 + Symbol),需要组合使用:[...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertySymbols(obj)]
实际挖掘技巧与注意事项
直接调用 Object.getOwnPropertySymbols(obj) 返回的是 Symbol 数组,但 Symbol 值本身无法直接打印出含义——控制台通常显示为 Symbol(description) 或 Symbol() (无描述时)。要真正“挖掘”,需进一步操作:
- 遍历后用
obj[symbol]获取对应值,观察用途(比如是不是一个函数、一个标记、还是内部状态) - 对每个 Symbol 调用
symbol.description查看是否有描述文字;若为空,可能是匿名 Symbol,也可能是框架私有 Symbol(如Symbol.for('vue:ref')) - 注意:它不会返回继承来的 Symbol 属性。如果想查原型链上的 Symbol,得手动遍历
Object.getPrototypeOf(obj)并递归调用 - 某些 Symbol 属性可能被设为不可配置(
configurable: false),但getOwnPropertySymbols依然能列出它们——只是后续delete会失败
一个小而实用的调试片段
快速查看一个对象所有 Symbol 属性及其值:
const symbols = Object.getOwnPropertySymbols(obj);
symbols.forEach(sym => {
console.log(
`Symbol${sym.description ? `(${sym.description})` : ''}:`,
obj[sym]
);
});配合 console.dir(obj, { showHidden: true })(部分浏览器支持)效果更佳,但 getOwnPropertySymbols 更可靠、更可控。










