Symbol 是 JavaScript 中保证唯一性的原始类型,每次调用 Symbol() 都生成本质不同、不可复现的值;可用于避免对象属性命名冲突、实现“隐身”属性、跨模块共享标识(Symbol.for)及模拟私有成员与定制行为。
JavaScript 中的 Symbol 是一种原始类型,它的核心价值就在于“唯一性”——每次调用 Symbol() 都会生成一个**全新且不可复现**的值,哪怕描述字符串完全一样,它们也互不相等。这种特性不是靠运行时检查实现的,而是语言层面的强制保证。
它不像随机字符串或时间戳那样靠概率避免重复,而是设计上就杜绝了相等可能:
Symbol('id') === Symbol('id') 永远是 false
Symbol() === Symbol() 也永远是 false
当多个模块、插件或团队成员需要向同一个对象添加属性时,用字符串作键极易覆盖。Symbol 提供了天然隔离:
user.id = 1001,你加 user[Symbol('id')] = 'uuid-abc' —— 两者共存无干扰cacheKey,但分别用 Symbol('cacheKey') 和 Symbol('cacheKey'),彼此完全独立Object.keys()、for...in 或 JSON.stringify() 中,天然“隐身”Symbol.for() 管理跨模块共享标识普通 Symbol() 太“私密”,有时你需要“同名即同义”的唯一性(比如统一的调试标记或协议标识):
Symbol.for('logger') 第一次调用会创建并注册,之后再调用返回同一个 SymbolSymbol.keyFor(Symbol.for('logger')) 能反查出注册名,方便调试和协作Symbol.for('react.element') 这类跨包识别标识唯一性 +
不可枚举性,让 Symbol 成为轻量级封装工具:
const _internal = Symbol('data') 存储敏感字段,外部无法通过遍历发现,也不能被同名字符串键意外覆盖Symbol.iterator),唯一性确保你自定义的迭代逻辑不会被其他同名 Symbol 干扰