Symbol 是 JavaScript 的第七种原始类型,用于创建唯一不可变的值以避免属性名冲突;每个 Symbol 值唯一,即使描述相同也不相等,不可隐式转字符串,常作对象私有属性键,支持全局注册表 Symbol.for() 复用。

Symbol 是 JavaScript 中一种原始数据类型,用来创建唯一且不可变的值,主要解决对象属性名冲突问题。
Symbol 的核心特点
每个 Symbol 值都是独一无二的,即使描述相同,它们也不相等:
- Symbol('foo') !== Symbol('foo') —— 两次调用返回两个不同 Symbol
- typeof Symbol() === 'symbol' —— 它是第七种原始类型(其他为 string、number、boolean、null、undefined、bigint)
-
Symbol 值不能被隐式转换为字符串,直接拼接会报错,需显式调用
.toString()或String(sym)
如何创建 Symbol 值
使用 Symbol() 函数创建,可选传入一个描述字符串(仅用于调试,不影响唯一性):
-
let sym1 = Symbol(); —— 无描述,打印为
Symbol() -
let sym2 = Symbol('id'); —— 有描述,打印为
Symbol(id) -
let sym3 = Symbol('id'); —— 即使描述相同,
sym2 !== sym3
Symbol 作为对象属性名的用途
Symbol 最常见用途是定义对象中“私有”或“内部”属性,避免键名被意外覆盖或枚举:
立即学习“Java免费学习笔记(深入)”;
- const key = Symbol('name');
- const obj = { [key]: 'Alice' };
-
obj[key] 可正常访问,但
for...in、Object.keys()、JSON.stringify()都不会包含它 - 想获取所有 Symbol 属性?用
Object.getOwnPropertySymbols(obj)
全局 Symbol 注册表:Symbol.for() 和 Symbol.keyFor()
如果需要跨模块复用同一个 Symbol,可用全局注册表:
- Symbol.for('shared') —— 检查全局注册表,存在则返回,否则新建并登记
-
Symbol.keyFor(sym) —— 返回该 Symbol 在注册表中的键名(仅对
Symbol.for()创建的生效) -
Symbol.for('a') === Symbol.for('a') —— 这次是
true










