symbol是javascript中用于创建唯一、不可重复值的原始类型,常作对象私有属性键;需用方括号访问,不参与常规遍历;可通过symbol.for()全局共享,symbol.keyfor()查询其键名。

Symbol 是 JavaScript 中一种原始数据类型,专门用来创建唯一、不可重复的值,常用于定义对象中不会被意外覆盖或枚举到的私有属性。
Symbol 的基本创建和使用
调用 Symbol() 函数即可生成一个独一无二的 Symbol 值。即使描述相同,每次调用也返回不同值:
const sym1 = Symbol('key');
const sym2 = Symbol('key');
console.log(sym1 === sym2); // false
Symbol 可作为对象属性名(键),但必须用方括号语法,不能用点号:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
const obj = {};
const id = Symbol('id');
obj[id] = 123;
console.log(obj[id]); // 123
console.log(obj.id); // undefined(点号访问不到)
Symbol 属性不会被常规遍历获取
Symbol 类型的属性名具有“隐藏性”:它们不会出现在 for...in、Object.keys()、Object.getOwnPropertyNames() 中,但可通过 Object.getOwnPropertySymbols() 显式获取:
-
Object.keys(obj)→ 返回字符串键数组(不含 Symbol) -
Object.getOwnPropertyNames(obj)→ 同样只返回字符串键 -
Object.getOwnPropertySymbols(obj)→ 专门返回 Symbol 键组成的数组 -
Reflect.ownKeys(obj)→ 同时返回字符串键 + Symbol 键(按添加顺序)
全局 Symbol 注册表:Symbol.for() 和 Symbol.keyFor()
如果需要跨模块/跨执行上下文共享同一个 Symbol,可使用全局注册表:
-
Symbol.for('shared'):检查全局注册表中是否存在该描述的 Symbol,有则返回,无则创建并登记 -
Symbol.keyFor(sym):传入一个全局 Symbol,返回其登记时使用的字符串键;对私有 Symbol(直接 Symbol() 创建)返回undefined
const s1 = Symbol.for('abc');
const s2 = Symbol.for('abc');
console.log(s1 === s2); // true
console.log(Symbol.keyFor(s1)); // 'abc'
console.log(Symbol.keyFor(Symbol('abc'))); // undefined
常见用途与注意事项
- 模拟私有属性:避免命名冲突,适合库作者封装内部状态
- 定义协议方法:如
Symbol.iterator让对象可迭代,Symbol.toPrimitive控制类型转换 - Symbol 值不能参与运算或隐式转换,
String(sym)或sym.toString()才能转为字符串 - JSON.stringify() 会忽略 Symbol 键及其对应值,序列化时不输出
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










