CodeWalk

Symbol 类型有哪些特点和应用场景?

作者:我还是少年 · 2026-05-30 12:55

请说明 Symbol 的特性、常用静态方法及其实际应用场景。

回答

我还是少年

Symbol:ES6 引入的第七种基本类型,表示唯一的标识符。

特性

  • 独一无二:Symbol() !== Symbol()
  • 不可枚举:不会出现在 for...inObject.keys()
  • 不可隐式转换为字符串:String(Symbol('a')) ✅,'' + Symbol('a')
  • 作为对象属性名可避免命名冲突

静态方法

  • Symbol.for(key):全局符号注册表,相同 key 返回同一个 Symbol
  • Symbol.keyFor(sym):返回全局 Symbol 的 key
  • Symbol.iterator:实现可迭代协议
  • Symbol.toStringTagSymbol.hasInstanceSymbol.species

应用场景

  1. 唯一属性键:防止对象属性名冲突(第三方库混合使用)
  2. 定义内部私有方法(并非真正的私有,可通过 Object.getOwnPropertySymbols 获取)
  3. 元编程:重写 Symbol.hasInstance 自定义 instanceof 行为
  4. 定义迭代器:实现 [Symbol.iterator] 使对象可迭代
  5. 枚举常量:模拟枚举 const RED = Symbol('red')
  6. 内置行为自定义Symbol.toPrimitive 控制对象类型转换