ES6 Symbol 特点及其用途

特点:创建唯一标识

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 可使用[]访问(不能用.访问)

  1. 避免属性重名覆盖
const symbol = Symbol('attrName')
let a = {
	[symbol]: "xxx",
	// 不是变量的方式
	[Symbol("attrName")]: "xxxx"  // 但两个属性名并不相同
}
  1. 为对象创建 “私有属性” (一定程度上限制访问)
    可以把一些 不需要对外操作和访问 的属性使用 Symbol 来定义
  • Symbol 属性不会被 for inObject.keysObject.getOwnPropertyNames 等常规遍历获取
  • JSON.stringify() 也不会处理 Symbol
  • 可以通过 Object.getOwnPropertySymbols 访问 Symbol 属性
  • 也可以通过 Reflect.ownKeys(obj) 访问(包括 Symbol 的)全部属性

class 提供 #前缀的方式创建 私有属性 和 方法

2. 定义常量

保证常量间互不相等,保证常量与变量不相等
同通常为一些标识性常量 状态标识

const COLOR_RED    = Symbol(1); // 不需要考虑标识性常量具体赋什么值
const COLOR_GREEN  = Symbol(2);  // 也不用担心其与变量值相同而造成 bug

参考博客
参考2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值