object.getownpropertysymbols 返回对象自身所有 symbol 类型属性键组成的数组。它不包含字符串键,也不查找原型链上的 symbol 属性,仅返回直接定义在该对象上的 symbol 键,顺序与定义一致;若无 symbol 属性,则返回空数组。

Object.getOwnPropertySymbols 是 JavaScript 中专门用于获取对象**自身所有 Symbol 类型属性键**的方法。它不会返回字符串键,也不会查找原型链上的 Symbol 属性,只返回当前对象直接拥有的 Symbol 键组成的数组。
基本用法:获取对象自身的 Symbol 属性名
调用方式很简单:
- 传入一个对象作为参数
- 返回一个包含该对象所有自有 Symbol 键的数组(顺序与定义顺序一致)
- 如果对象没有 Symbol 属性,返回空数组
[]
例如:
const sym1 = Symbol('a');const sym2 = Symbol('b');
const obj = {
[sym1]: 'value1',
[sym2]: 'value2',
str: 'hello'
};
console.log(Object.getOwnPropertySymbols(obj));
// [Symbol(a), Symbol(b)]
注意:不包括字符串键和继承的 Symbol 属性
这个方法有明确的边界:
- 忽略所有字符串类型的属性名(如
str) - 不查找原型链——即使父对象有 Symbol 属性,子对象调用也不会返回
- 只关心“自有”(own)属性,即通过
Object.defineProperty或字面量直接定义在该对象上的 Symbol 键
比如:
const child = Object.create(parent);
child[Symbol('y')] = 'from child';
console.log(Object.getOwnPropertySymbols(child));
// [Symbol(y)] —— 只有自己定义的,Symbol(x) 不会出现
配合 Reflect.ownKeys 或 Object.getOwnPropertyNames 使用更全面
如果你想同时拿到字符串键和 Symbol 键,可以组合使用:
-
Object.getOwnPropertyNames(obj):获取所有自有字符串键 -
Object.getOwnPropertySymbols(obj):获取所有自有 Symbol 键 - 合并两者即可模拟
Reflect.ownKeys(obj)的效果(后者正是这样实现的)
示例:
const s = Symbol('s');const obj = { a: 1, b: 2, [s]: 3 };
const keys = [...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertySymbols(obj)];
console.log(keys); // ['a', 'b', Symbol(s)]
实际用途:遍历或检查私有/元数据 Symbol 属性
Symbol 常被用作“隐藏”或“非枚举”的键,比如:
- 内置 Symbol(如
Symbol.iterator、Symbol.toStringTag) - 第三方库添加的元数据(如
Symbol.for('myLib.cache')) - 你自己定义的内部状态标识符
这时 Object.getOwnPropertySymbols 就是唯一能可靠提取这些键的方式,for...in 和 Object.keys() 都看不到它们。











