Symbol 类型有哪些特点和应用场景?
请说明 Symbol 的特性、常用静态方法及其实际应用场景。
回答
我还是少年
Symbol:ES6 引入的第七种基本类型,表示唯一的标识符。
特性:
- 独一无二:
Symbol() !== Symbol() - 不可枚举:不会出现在
for...in、Object.keys()中 - 不可隐式转换为字符串:
String(Symbol('a'))✅,'' + Symbol('a')❌ - 作为对象属性名可避免命名冲突
静态方法:
Symbol.for(key):全局符号注册表,相同 key 返回同一个 SymbolSymbol.keyFor(sym):返回全局 Symbol 的 keySymbol.iterator:实现可迭代协议Symbol.toStringTag、Symbol.hasInstance、Symbol.species等
应用场景:
- 唯一属性键:防止对象属性名冲突(第三方库混合使用)
- 定义内部私有方法(并非真正的私有,可通过
Object.getOwnPropertySymbols获取) - 元编程:重写
Symbol.hasInstance自定义 instanceof 行为 - 定义迭代器:实现
[Symbol.iterator]使对象可迭代 - 枚举常量:模拟枚举
const RED = Symbol('red') - 内置行为自定义:
Symbol.toPrimitive控制对象类型转换