Object.getOwnPropertySymbols 返回对象自身所有Symbol键名的数组,不包含字符串键且不遍历原型链;它返回所有自有Symbol属性(无论是否可枚举),需配合obj[symbol]获取值或与Object.keys合并实现全属性遍历。

Object.getOwnPropertySymbols 用于获取对象自身(非继承)的所有 Symbol 类型键名,返回一个 Symbol 数组。它不包括字符串键,也不遍历原型链。
基本用法:获取对象自身的 Symbol 属性
直接传入目标对象即可:
const obj = {
name: 'Alice',
[Symbol('id')]: 123,
[Symbol('token')]: 'abc'
};
const symbols = Object.getOwnPropertySymbols(obj);
console.log(symbols); // [Symbol(id), Symbol(token)]
注意:name 是字符串属性,不会出现在结果中。
配合 Object.assign 或 Reflect.ownKeys 实现完整属性遍历
因为 Object.keys() 和 for...in 都忽略 Symbol,若需遍历所有自有属性(含 Symbol),可合并使用:
立即学习“Java免费学习笔记(深入)”;
- 用
Object.keys(obj)获取字符串键 - 用
Object.getOwnPropertySymbols(obj)获取 Symbol 键 - 用扩展运算符合并:
[...Object.keys(obj), ...Object.getOwnPropertySymbols(obj)]
例如:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
const allKeys = [ ...Object.keys(obj), ...Object.getOwnPropertySymbols(obj) ]; // ['name', Symbol(id), Symbol(token)]
只获取 Symbol 属性的值?需手动提取
Object.getOwnPropertySymbols 只返回键,不返回值。要取值,得配合 obj[symbol]:
const symbols = Object.getOwnPropertySymbols(obj); const values = symbols.map(sym => obj[sym]); console.log(values); // [123, 'abc']
也可结合 Object.getOwnPropertyDescriptor 获取更详细信息(如是否可枚举、是否可写等)。
注意:不可枚举的 Symbol 属性也会被返回
所有自有 Symbol 属性,无论 enumerable: true 还是 false,都会被 Object.getOwnPropertySymbols 返回。这和 Object.keys(只返回可枚举字符串键)不同。
例如:
const sym = Symbol('hidden');
Object.defineProperty(obj, sym, {
value: 'secret',
enumerable: false
});
console.log(Object.getOwnPropertySymbols(obj)); // 仍包含 sym
不复杂但容易忽略:Symbol 属性天然“隐身”,必须显式调用这个 API 才能发现它们。

















