Symbol

1. 特点:每个Symbol实例都是唯一的。因此,当你比较两个Symbol实例的时候,将总会返回false,产生唯一数据

let test = Symbol()
let test1 = Symbol()
console.log(test === test1) // false
let test = Symbol() // 初始化一个Symbol
console.log(typeof test) // symbol

2. 添加描述

let test = Symbol('好的')
let test1 = Symbol('美丽中国')
console.log(test.description) // 好的
console.log(test1.description) // 美丽中国

3. 另一种定义Symbol的方式 Symbol.for()

使用Symbol.for定义,区别是系统会在内存中进行记录(全局声明)相同的只会定义一次,如果下次再同样定义,会把之前定义过的直接拿过来,全局共享

Symbol.for() 仅接受单个字符串类型的参数

let a = Symbol.for('html')
console.log(a) // Symbol(html)
let b = Symbol.for('html')
console.log(a === b) // true

Symbol.for() 首先会全局搜索符号注册表,看看是否存在一个键值为‘html’ 的符号值,如果存在,则返回这个符号值,如果不存在,则创建一个符号值,并返回新的符号值。

如果一个Symbol反复被使用可以使用Symbol.for()进行定义

4. 使用Symbol.for 定义,用Symbol.keyFor() 获取描述

let a = Symbol.for('html')
console.log(Symbol.keyFor(a)) // html
let symbol = Symbol('uid')
    console.log(Symbol.keyFor(symbol)) // undefined

 使用Symbol创建的,Symbol.keyFor 搜不到

5. css解决字符串耦合问题

对象里面使用变量作为 key 和 value 要加 []

let user = 'lucy'
    let name = 'lucy'
    let obj = {
      user: {
        Math: 94,
        Chinese: 88
      },
      name: {
        Math: 99,
        Chinese: 80
      }
    }
    console.log(obj)

user、name 完全没有被解析成 lucy

正确做法加上[]

let user = 'lucy'
    let name = 'lucy'
    let obj = {
      [user]: {
        Math: 94,
        Chinese: 88
      },
      [name]: {
        Math: 99,
        Chinese: 80
      }
    }
    console.log(obj)

名字lucy渲染出来了,但是同名的key前面把后面的覆盖了,一个班级有重名的人很常见,不能够进行覆盖,这时候就可以利用Symbol了

   let user = {
      name: 'lucy',
      type: Symbol()
    }
    let name = {
      name: 'lucy',
      type: Symbol()
    }
    let obj = {
      [user.type]: {
        Math: 94,
        Chinese: 88
      },
      [name.type]: {
        Math: 99,
        Chinese: 80
      }
    }
    console.log(obj)
    console.log(obj[user.type])
    console.log(obj[name.type]) 

主要思路:以 Symbol 作为key进行存储,永远不会重复,如果遇到想要唯一字段,避免同名覆盖,就是用Symbol

6. Symbol遍历

Reflect.ownKeys()

let symbol = Symbol()
    let obj = {
      name: 'zhou',
      [symbol]: 23
    }
    for(const key of Reflect.ownKeys(obj)) {
      console.log(key)
    }
    //name
    // Symbol()

不能用普通的遍历 否则获取不到

 

Object.getOwnPropertySymbols() 只能遍历 Symbol

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值