Symbol基本数据类型----ES6重刷11

在ES6中除了以前的六种数据类型【基本数据类型:Undefined、Null、Number、String、Boolean,引用数据类型:Object】,新增了一种基本数据类型Symbol,在此我就谈谈它的某些本人认知到的特点。

一、独一无二性
引入这个基本数据类型的初衷就是因为它的独一无二的特性,这将会解决潜在的问题,关于命名的冲突问题,比如给一个为外在资源中的一个对象进行添加属性,这就可以利用Symbol的独一无二的特性避免潜在的属性名冲突。

const obj = {
  a: 'value_a',
  b: 'value_b',
}
obj[Symbol.for('addC')] = 'value_c' 
// 至于为什么用Symbol.for()而不直接用Symbol(),是因为Symbol.for()是存在全局登记机制,而Symbol()是没有全局登记机制的
// 这就意味着,我需要给它一个单独的变量,而这种情况是我不愿看到的,为每一个特殊属性名设置变量
// 造成变量的堆砌泛滥,导致后期难以清楚知道这代表了什么
console.log(obj) // {a: "value_a", b: "value_b", Symbol(addC): "value_c"}

二、利用其独一无二性来消除魔法字符串
在一种场景,不在乎值具体是什么,而在乎值相互不同,从而进行语句判断,比如:利用对象键值对的一一对应特性,结合switch语句来代替多重if...else...判断。

const obj = {
  case_1: Symbol(),
  case_2: Symbol(),
  case_3: Symbol(),
}
const test = ({ attrName, obj }) => {
  switch (obj[attrName]) {
    case obj.case_1:
      console.log("case_1")
      break
    case obj.case_2:
      console.log("case_2")
      break
    case obj.case_3:
      console.log("case_3")
      break
  }
  return ''
}
test({ attrName: 'case_1', obj })

三、对象普通遍历方法无法被选中
也就是说,Symbol 作为属性名,该属性不会出现在for...in循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。
利用这种特性,我们就可以将某些不需要或则不愿意被遍历到的属性名、属性值,利用Symbol作为其属性名,这样就避免利用Object.defineProperty方法对每个特殊的属性名进行属性特性的重定义。

const obj = {
  case_1: Symbol(),
  case_2: Symbol(),
  case_3: Symbol(),
}
obj[Symbol('case_4')] = 'case_4'
// 注意,const冻结的只是obj这个指向其内部存储位置的指针
// 而不是其内部储存,所以尽管对象obj是const声明,也可以修改、增加、减少其内部的属性
console.log(obj)
for (const item in obj) {
  console.log(item) // case_1, case_2, case_3
}

四、对于Symbol()、Symbol.for()、Symbol.keyFor()的区别
1、Symbol():每次单纯的返回一个独一无二的Symbol值,即使内部的描述字符串是一致的,比如Symbol(‘case’)和Symbol(‘case’),但是两者的值却是不同的。
注意,Symbol()没有全局登记机制。

2、Symbol.for():每次会先在全局登记表中搜寻与其描述字符串一致的Symbol值,比如Symbol.for(‘case’)和Symbol.for(‘case’),两者的值是一致的;若没有搜寻到与其描述字符串一致的Symbol值,就会在全局登记表中登记此次返回的Symbol值。
注意,Symbol.fo()存在全局登记机制。

3、Symbol.keyFor():搜寻全局登记表中与其描述字符串一致的Symbol值,若没有搜寻到与其描述字符串一致的Symbol值,则返回undefined。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值