关于Symbol的理解与使用

85 阅读1分钟

What?

Symbol是基本数据类型中的一种,调用Symbol()会生成一个具有独立性的变量,调用typeOf检测其数据类型为'Symbol',使用Symbol()生成的两个变量不会相同

let a = symbol() 
let b= symbol()
console.log(a === b) //false

若要使用Symbol生成一样的变量则需要使用Symbol.for,若不使用Symbol()括号中的内容仅仅只是针对变量的描述,两个Symbol类型的数据即使是描述相同他们变量也不相同

let a1 = Symbol.for('a')
let a2 = Symbol.for('a')
console.log(a1 === a2)  //true

Why?

Symbol的两大特性:

1.生成的变量具有唯一性

2.利用调用Symbol()生成的变量名不会被Object.keys/for...in/Object.getOwnProperty等方法直接访问的特点 可以针对对象属性进行初步的封装,使其不能被常规方法直接访问,要访问变量中的Symbol值就必须要使用Object.geOwnPropertySymbols或者使用新增的Reflect身上的ownKeys (关于Object和Reflect之间的联系与区别将在之后的文章中探讨)

let hobby =Symbol('hobby')
let person ={
    name:'Ccclot',
    [hobby]:'guitar'
    }
 Object.keys(person)  //name
 for(key in person){
     console.log(key)
     } //name
 Object.getOwnProperty(person) //name
 Object.getOwnPropertySymbols(person) //[Symbol('hobby')]

How?

1.利用声明的变量都具有独一性的特点, 在开发在面对要大量声明常量的情况下我们就可以使用Symbol来避免大量去空想变量值的情况

const type = {
      global: {
    SHOW_GLOBAL_LOADING: Symbol(),
    STORE_SCROLLTOP: Symbol(),
    USER_INFO: Symbol()
  }

2.利用以Symbol类型值为变量名不会被轻易访问的特点,可以针对类的某些私有属性和方法进行定义

const createrName = Symbol()
class Bulletin{
    constructor(title,createrName){
        this.username = username
        this[createrName] = createrName
        }
    checkCreater(c){
        return this[createName] === c
        }
 } //此时Bulletin中的createrName属性是不能被调用组件直接访问的,但是可以通过调用checkCreater进行比较