symbol()每次调用生成全新不等值,用于模块私有属性;symbol.for(key)基于key全局唯一复用,支持跨上下文共享;symbol.keyfor()仅对symbol.for()有效,返回key或undefined。

Symbol() 每次调用都生成一个全新、互不相等的值;Symbol.for(key) 则基于字符串 key 在全局注册表中查找或创建,相同 key 总是返回同一个 Symbol 实例。
Symbol():局部唯一,绝不复用
它不依赖任何外部状态,纯粹按调用次数生成独立符号。哪怕描述字符串一模一样,结果也完全不等:
-
Symbol('id') === Symbol('id')→ false - 该 Symbol 只在当前作用域内有效,无法被其他模块或 iframe 访问到
- 适合定义模块内部私有属性,比如
const PRIVATE_DATA = Symbol('data')
Symbol.for():全局登记,跨上下文共享
它把 key 当作“身份证号”,先查全局注册表,有就取,没有才建:
-
Symbol.for('state') === Symbol.for('state')→ true - 主页面、iframe、Web Worker 中调用同一 key,拿到的是同一个 Symbol
- 常用于插件系统或框架层统一标识,例如
Symbol.for('react.element')
Symbol.keyFor() 的适用边界
这个方法只认 Symbol.for() 创建的 Symbol,普通 Symbol 会返回 undefined:
-
Symbol.keyFor(Symbol.for('config'))→ 'config' -
Symbol.keyFor(Symbol('config'))→ undefined - 无法反向推断某个 Symbol 是否注册过,也不能枚举整个注册表
怎么选:看作用域和复用需求
不需要跨模块识别,只要防冲突 → 用 Symbol();需要多处协调、调试追踪或沙箱互通 → 用 Symbol.for():
- 组件内部缓存字段 →
Symbol('cache') - 第三方插件约定配置键 →
Symbol.for('plugin.config') - 调试工具统一标记对象类型 →
Symbol.for('debug.type')
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











