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

posted @   海胆Sur  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示