要用 reflect 获取对象的符号属性键,核心是使用 reflect.ownkeys(),它会返回包括字符串和 symbol 类型在内的所有自有属性键,再配合 typeof 过滤出 symbol 类型即可。

要用 Reflect 获取对象的符号属性键,核心是使用 Reflect.ownKeys(),它会返回包括字符串和 Symbol 类型在内的所有自有属性键。再配合 typeof 过滤出 Symbol 类型即可。
用 Reflect.ownKeys() 获取全部键,再筛选 Symbol
Reflect.ownKeys(obj) 返回一个数组,包含对象自身所有属性的键(含不可枚举的、Symbol 的、字符串的),这是唯一能同时拿到 Symbol 键和字符串键的 Reflect 方法。
之后用 filter 提取 Symbol 类型的键:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
const sym1 = Symbol('a');
const sym2 = Symbol('b');
const obj = {
name: 'Alice',
[sym1]: 123,
[sym2]: 'hello'
};
const symbolKeys = Reflect.ownKeys(obj).filter(key => typeof key === 'symbol');
// → [Symbol(a), Symbol(b)]
为什么不用 Reflect.getOwnPropertyNames() 或 Object.keys()?
这两个方法只返回字符串类型的自有属性名,完全忽略 Symbol 键:
-
Object.keys(obj)→['name'] -
Reflect.getOwnPropertyNames(obj)→['name'] - 只有
Reflect.ownKeys(obj)→['name', Symbol(a), Symbol(b)]
注意:Reflect.ownKeys 不包含原型链上的 Symbol 属性
它只返回对象自身的属性键。如果想获取原型链上的 Symbol 键,需要手动遍历原型链,例如:
function getAllSymbolKeys(obj) {
const keys = new Set();
while (obj !== null) {
Reflect.ownKeys(obj).forEach(key => {
if (typeof key === 'symbol') keys.add(key);
});
obj = Object.getPrototypeOf(obj);
}
return Array.from(keys);
}
配合 getOwnPropertyDescriptor 获取 Symbol 属性描述符
拿到 Symbol 键后,可用 Reflect.getOwnPropertyDescriptor(obj, symKey) 查看其配置(如是否可写、是否可枚举等):
const desc = Reflect.getOwnPropertyDescriptor(obj, sym1);
// → { value: 123, writable: true, enumerable: true, configurable: true }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










