Symbol类型

Symbol类型

Symbol(符号)是ECMAScript6新增的数据类型。符号是原始值,且符号实例是唯一、不可变的。符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险

声明定义Symbol的几种方式


      let sym = Symbol()
      let sym1 = Symbol()
      console.log(sym == sym1) // false
      let sym2 = Symbol('可以传入字符串参数作为符号的描述')
      console.log(sym2.description) // 可以传入字符串参数作为符号的描述
      console.log(sym2) // Symbol(可以传入字符串参数作为符号的描述)
      console.log(sym2.toString()) // Symbol(可以传入字符串参数作为符号的描述)


   
      let sym = Symbol.for('全局注册')
      let sym1 = Symbol.for('全局注册')
      console.log(sym == sym1) // true
      console.log(Symbol.keyFor(sym)) // 全局注册
      console.log(Symbol.keyFor(sym1)) // 全局注册



使用Symbol解决字符串耦合问题

在对象中如果key名重复,后面的key会把前面的key覆盖,使用Symbol类型定义唯一值,解决覆盖问题


      let user1 = {
        name: 'lisi',
        key: Symbol(),
      }
      let user2 = {
        name: 'lisi',
        key: Symbol(),
      }
      let grade = {
        [user1.key]: { js: 90, css: 100 },
        [user2.key]: { js: 20, css: 40 },
      }
      console.log(grade) // Symbol(): {js: 90, css: 100}
      // Symbol(): {js: 20, css: 40}
      console.log(grade[user2.key]) // { js: 20, css: 40 }


Symbol在缓存器中的使用


class Cache {
        static data = {}
        static set(name, value) {
          this.data[name] = value
        }
        static get(name) {
          return this.data[name]
        }
      }
      let user = {
        name: 'apple',
        key: Symbol(),
      }
      let cart = {
        name: 'apple',
        key: Symbol(),
      }
      Cache.set(user.key, user)
      Cache.set(cart.key, cart)
      console.log(Cache.get(user.key))


扩展特性与对象属性保护

使用Symbol定义key不会被for..in和for..of遍历到,通过for ..of Reflect.ownKeys()可以遍历到对象里面的Symbol属性


      let sym = Symbol('这是一个Symbol类型')
      let hd = {
        name: 'doudun',
        [sym]: 'doudounnnn',
      }
      for (const key in hd) {
        console.log(key) // name
      }
      for (const key of Object.getOwnPropertySymbols(hd)) {
        console.log(key) // Symbol(这是一个Symbol类型)
      }
      for (const key of Reflect.ownKeys(hd)) {
        console.log(key) // name Symbol(这是一个Symbol类型)
      }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值