object.getownpropertysymbols用于获取对象自身所有symbol类型属性键,返回symbol数组,不包含字符串键或继承属性,即使无symbol属性也返回空数组。

Object.getOwnPropertySymbols 是 JavaScript 中专门用于获取对象**自身所有 Symbol 类型属性键**的方法,它只返回 Symbol 类型的 key(不包括字符串 key),且仅包含对象自身的、不可枚举的 Symbol 属性(注意:Symbol 属性默认就是不可枚举的)。
基本用法:获取对象自身的 Symbol 属性名
该方法接收一个对象作为参数,返回一个由 Symbol 组成的数组。即使对象没有 Symbol 属性,也返回空数组(不会返回 undefined 或报错)。
例如:
const sym1 = Symbol('a');
const sym2 = Symbol('b');
const obj = {
[sym1]: 'value1',
[sym2]: 'value2',
name: 'test' // 字符串属性,不会被返回
};
console.log(Object.getOwnPropertySymbols(obj));
// [Symbol(a), Symbol(b)]
只返回自身属性,不包括继承链上的 Symbol
和 Object.keys() 或 Reflect.ownKeys() 类似,它只查对象“自己定义”的 Symbol 属性,不会向上查找原型链。
比如:
const parent = {};
const sym = Symbol('shared');
parent[sym] = 'in prototype';
const child = Object.create(parent);
child.other = 'own';
console.log(Object.getOwnPropertySymbols(child)); // []
console.log(Object.getOwnPropertySymbols(parent)); // [Symbol(shared)]
配合 Symbol.for 实现全局共享 Symbol 的查找
如果使用 Symbol.for(key) 创建的 Symbol 是全局注册的,但 Object.getOwnPropertySymbols() 仍然只返回当前对象**实际拥有该 Symbol 作为 key 的属性**,不会自动查找或匹配全局注册表。
也就是说:是否能查到,取决于对象是否真的用那个 Symbol 当作属性名赋过值,而不是看它是否在全局注册过。
正确示例:
const sym = Symbol.for('myKey');
const obj = { [sym]: 'hello' };
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(myKey)]
错误理解(不会生效):
Symbol.for('myKey'); // 只注册,没往 obj 上挂属性
const obj = {};
console.log(Object.getOwnPropertySymbols(obj)); // []
常与 Reflect.ownKeys 或 Object.getOwnPropertyNames 配合使用
若想完整获取对象所有自有属性键(含字符串、Symbol、甚至不可枚举的字符串属性),可以组合使用:
-
Object.getOwnPropertyNames(obj)→ 获取所有**字符串类型**的自有属性名(包括不可枚举的) -
Object.getOwnPropertySymbols(obj)→ 获取所有**Symbol 类型**的自有属性名 -
Reflect.ownKeys(obj)→ 一次性获取两者(字符串 + Symbol),顺序是:先字符串(按创建顺序),再 Symbol(按创建顺序)
例如:
const s1 = Symbol('s1');
const s2 = Symbol('s2');
const obj = {
a: 1,
[s1]: 'sym1'
};
Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
obj[s2] = 'sym2';
console.log(Reflect.ownKeys(obj));
// ['a', 'b', Symbol(s1), Symbol(s2)]
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











