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进行比较