Object.getOwnPropertySymbols()用于获取对象自身所有Symbol属性,因其唯一性、不可复现性及不参与常规遍历(如for...in、Object.keys等),Symbol属性被称为“隐藏”;它只返回自有Symbol,不包括继承的,配合Object.getOwnPropertyDescriptors可获取其完整描述符。

Object.getOwnPropertySymbols() 专门用于获取对象自身定义的所有 Symbol 类型属性(不包括字符串键,也不包括继承来的 Symbol),是遍历“隐藏符号属性”的标准方法。
为什么 Symbol 属性算“隐藏”?
Symbol 是唯一且不可复现的原始值,用它作对象属性名时,不会被 for...in、Object.keys()、JSON.stringify() 或常规的点号/方括号访问(除非你明确知道那个 Symbol)识别。它们天然避开常规遍历逻辑,因此常被用作内部标识或元数据——这就是所谓“隐藏”的实际含义。
用 Object.getOwnPropertySymbols() 获取并遍历
该方法返回一个 Symbol 数组,你可以用 forEach、for...of 或 map 等方式处理每个 Symbol 键,再通过方括号访问对应值:
- 先调用
Object.getOwnPropertySymbols(obj)得到所有自有 Symbol 键 - 对每个 Symbol 键,用
obj[symbol]读取值 - 注意:它只返回“自有” Symbol,不包含原型链上的(如
Symbol.iterator在 Array 原型上,但不会出现在Object.getOwnPropertySymbols([])结果中)
配合 Object.getOwnPropertyDescriptors 更进一步
如果需要同时查看 Symbol 属性的可枚举性、可配置性、是否为访问器等元信息,可以用 Object.getOwnPropertyDescriptors(obj) ——它的返回对象会把 Symbol 键作为属性名包含进去。例如:
const obj = { [sym]: 123 };
const descriptors = Object.getOwnPropertyDescriptors(obj);
// descriptors[sym] 就是 { value: 123, writable: true, enumerable: true, configurable: true }
常见用途与注意事项
- 框架或库常用 Symbol 定义私有行为钩子(如
Symbol.toStringTag影响Object.prototype.toString.call()输出) - 不能靠
Object.assign({}, obj)复制 Symbol 属性(它只拷贝字符串键),需手动处理 - 若想遍历“所有” Symbol(含继承的),需递归检查原型链:
getOwnPropertySymbols+Object.getPrototypeOf










