特点:创建唯一标识
Symbol(“xx”) 每个实例都创建唯一标识符,避免重复;参数为描述信息可为空,即使相同描述信息,Symbol实例也不相等;
该类型不使用new进行创建
const symbol = Symbol('abc')
String(symbol) // 'abc'
symbol.description // "abc" ES2019
Symbol('abc') !== Symbol('abc') // true
Symbol.iterator 属性的有无 可以判断对象是否可以 被 for of 遍历
Symbel.for
会优先查找全局 Symbol 直接绑定已有的 Symbol
Symbel.for('haidan') === Symbol.for('haidan') // true
应用
1. 定义对象属性名
已知 Symbol 可使用
[]
访问(不能用.访问)
- 避免属性重名覆盖
const symbol = Symbol('attrName')
let a = {
[symbol]: "xxx",
// 不是变量的方式
[Symbol("attrName")]: "xxxx" // 但两个属性名并不相同
}
- 为对象创建 “私有属性” (一定程度上限制访问)
可以把一些 不需要对外操作和访问 的属性使用 Symbol 来定义
- Symbol 属性不会被
for in
、Object.keys
、Object.getOwnPropertyNames
等常规遍历获取- JSON.stringify() 也不会处理 Symbol
- 可以通过
Object.getOwnPropertySymbols
访问 Symbol 属性- 也可以通过
Reflect.ownKeys(obj)
访问(包括 Symbol 的)全部属性
class 提供
#
前缀的方式创建 私有属性 和 方法
2. 定义常量
保证常量间互不相等,保证常量与变量不相等
同通常为一些标识性常量 状态标识
const COLOR_RED = Symbol(1); // 不需要考虑标识性常量具体赋什么值
const COLOR_GREEN = Symbol(2); // 也不用担心其与变量值相同而造成 bug