symbol是es6引入的唯一原始值类型,每次调用symbol()都生成全新不相等的值,用作对象属性键可避免命名冲突、实现逻辑私有,并不可枚举、不参与字符串遍历。

Symbol 是 JavaScript 中一种原始数据类型,专门用于创建**独一无二、不可重复的值**,常用来做对象属性键,避免命名冲突,或实现私有属性效果。
Symbol 的基本创建和特性
每次调用 Symbol() 都会返回一个全新的、与其他任何 Symbol 值不相等的值,即使描述相同:
-
Symbol('foo') !== Symbol('foo')—— 返回true(它们不相等) -
typeof Symbol('id')返回"symbol" - Symbol 值不能参与运算,也不能隐式转为字符串(
String(sym)可以显式转换,但sym + ''会报错)
用 Symbol 作为对象属性名(避免覆盖/冲突)
把 Symbol 当作“唯一键”添加到对象中,可防止被意外修改或遍历到:
- 写法:
const id = Symbol('user_id'); obj[id] = 123; - 该属性不会出现在
for...in、Object.keys()、JSON.stringify()中 - 可用
Object.getOwnPropertySymbols(obj)单独获取所有 Symbol 键 - 也可用
Reflect.ownKeys(obj)同时拿到字符串键和 Symbol 键
全局 Symbol 注册表:Symbol.for() 和 Symbol.keyFor()
如果需要跨模块共享同一个 Symbol(比如统一的事件名或配置标识),可用全局注册表:
-
Symbol.for('debug'):先查全局池,存在就返回,否则新建并登记 -
Symbol.keyFor(sym):返回该 Symbol 在全局池中的键名(仅对Symbol.for()创建的生效) -
Symbol.for('a') === Symbol.for('a')→true;而Symbol('a') === Symbol('a')→false
常见实用场景举例
Symbol 不是炫技,而是解决真实问题:
- 模拟私有字段:用 Symbol 存储内部状态,外部无法通过常规方式访问
-
自定义迭代行为:给对象设置
[Symbol.iterator]方法,使其能被for...of遍历 -
定义唯一事件类型:如
emitter.on(Symbol.for('network-error'), handler),避免字符串拼写冲突 - 库作者防止属性劫持:在第三方对象上挂载元数据时,用 Symbol 键确保不干扰用户自有属性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











