symbol是es6新增的原始数据类型,用于创建唯一且不可变的标识符,主要解决对象属性名冲突、定义语义化常量(如枚举值、事件名)等场景,其值天然唯一、不可隐式转换、不参与字符串拼接。

Symbol 本身不是用来“创建常量”的语法机制,但它常被用作**定义唯一、不可冲突的常量标识符**,尤其适合替代字符串字面量作为枚举值、事件名、配置键等场景。它不提供运行时保护(比如禁止重赋值),但能确保值的唯一性与语义清晰性。
为什么用 Symbol 表示常量
传统字符串常量容易重复或拼错,例如:'USER_LOGIN' 和 'user_login' 可能被误用;而 Symbol 每次调用都生成新值,天然避免意外相等:
-
Symbol('status') !== Symbol('status')→ true - 即使描述相同,也绝不会与其他 Symbol 冲突
- 比字符串更明确表达“这是一个特殊标识,非普通文本”
典型写法:用 Symbol 定义模块级常量
把 Symbol 赋给 const 变量,就形成了一个稳定、不可变、唯一的意义标签:
const STATUS_PENDING = Symbol('pending');const STATUS_SUCCESS = Symbol('success');const EVENT_CLICK = Symbol('click');
这些变量本身是 const(不能重新赋值),其值又是 Symbol(不可变、唯一),组合起来就是安全可用的“语义常量”。
注意:这不是“私有常量”,而是“唯一标识常量”
Symbol 常量不隐藏、不加密,也不阻止访问——它只是确保不会被意外覆盖或误匹配:
- 可以自由导出/导入:
export const API_TIMEOUT = Symbol('api-timeout'); - 可用于 switch 或 Map 键:
map.set(API_TIMEOUT, 5000); - 不能用于 localStorage 或 JSON(因非字符串),也不适合做缓存 key
进阶:用 Symbol.for() 实现跨模块共享常量
如果多个文件需要识别同一个逻辑常量(如统一的错误类型),可用全局注册表:
const ERROR_NETWORK = Symbol.for('ERROR_NETWORK');- 任何地方调用
Symbol.for('ERROR_NETWORK')都得到同一个 Symbol - 配合
Symbol.keyFor(ERROR_NETWORK)可反查注册名,便于调试
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











