Symbol 是 JavaScript 的第七种原始类型,ES6 引入,本质是唯一、不可变、不可枚举的标识符,核心价值是作为不冲突、不暴露、不干扰的对象属性名,用于避免命名冲突、模拟弱私有属性、定义语义化常量键及通过内置 Symbol 定制对象底层行为。
Symbol 是 JavaScript 的第七种原始类型,ES6 引入,本质是**唯一、不可变、不可枚举的标识符**。它不是字符串,也不能被自动转换为字符串或数字,但可以安全地用作对象属性名——这是它最核心的价值:不冲突、不暴露、不干扰。
当你向已有对象(比如第三方库返回的对象)添加字段时,用字符串当 key 很容易撞车。Symbol 从根本上杜绝这个问题:
Symbol('id') === Symbol('id') 也是 false
for...in、Object.keys()、JSON.stringify() 中虽然现在有 #field 私有字段语法,但 Symbol 在兼容旧环境或需要更灵活控制时仍很实用:
_balance)代替字符串定义状态码、动作类型、日志级别等,避免拼错、重复或意外相等:
const LOADING = Symbol('loading') 和 const LOADING = 'loading' 看似一样,但后者可能被其他模块误赋值或覆盖switch 或 if 判断时,类型安全、无歧义LOADING.toString() 返回 "Symbol(loadi
ng)"
JavaScript 提供了一批以 Symbol.xxx 形式存在的“知名 Symbol”,它们是元编程的关键接口:
Symbol.iterator:让对象支持 for...of
Symbol.toStringTag:改变 Object.prototype.toString.call(obj) 的输出Symbol.toPrimitive:控制对象转数字/字符串时的行为(如 +obj 或 '' + obj)Symbol.asyncIterator:支持 for await...of
Symbol.hasInstance:自定义 instanceof 判定逻辑它不复杂,但容易忽略——尤其在封装工具、设计 API 或做兼容性方案时,Symbol 是那种“用了才知道真香”的小而关键的特性。