Symbol()每次调用生成唯一值,适合作为防冲突对象键;Symbol.for()则按描述复用同一Symbol,实现跨模块共享。

Symbol 类型通过 Symbol() 函数创建,每次调用都会生成一个**独一无二、不可复用**的值,天然适合作为对象中避免命名冲突的键。
直接调用 Symbol() 创建唯一键
最常用的方式是不传参直接调用:
const key1 = Symbol();const key2 = Symbol();- 即使内容相同,
key1 === key2也返回 false,因为每个 Symbol 值都是唯一的
可选描述符(description)仅用于调试,不影响唯一性
可以传入字符串作为描述,方便开发者识别,但不会影响相等性判断:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
const id = Symbol('id');const userId = Symbol('id');- 尽管描述都是
'id',id === userId仍是 false - 控制台打印时会显示
Symbol(id),便于排查
用作对象属性键:只能通过方括号访问
Symbol 作为键时,不会出现在 for...in、Object.keys() 或 JSON.stringify() 中,保证了“隐藏性”:
const sym = Symbol('hidden');const obj = { [sym]: 'secret', name: 'Alice' };-
obj[sym]→'secret'(必须用方括号) -
Object.keys(obj)→['name'](Symbol 键被忽略) -
Reflect.ownKeys(obj)→['name', Symbol(hidden)](可获取所有键,含 Symbol)
全局 Symbol 注册表:Symbol.for() 实现跨模块共享
如果需要**相同描述对应同一个 Symbol**(即“全局唯一”,而非“每次新建唯一”),用 Symbol.for(key):
const s1 = Symbol.for('debug');const s2 = Symbol.for('debug');- 此时
s1 === s2为 true -
Symbol.keyFor(s1)可反查注册名,返回'debug' - 注意:
Symbol('debug')和Symbol.for('debug')是完全不同的两个值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










