1.什么是symbol
2.應(yīng)用場(chǎng)景
一.symbol定義
Symbol是 js 新增加的一種基本數(shù)據(jù)類型,主要用來(lái)表示唯一值。
二.應(yīng)用場(chǎng)景
①作為屬性 避免屬性沖突重復(fù),就是使用它來(lái)表示唯一值;
var dataAtr = Symbol('dataAtr ');
const obj={[dataAtr ]:'屬性一定不會(huì)沖突',};
問(wèn)題是我們什么情況下 要保障屬性一定不沖突重復(fù) 覆蓋呢?
在vue里 有this.$parent ,this.$options ,this.$set 這些,使用$命名開頭就是想通過(guò)命名約定來(lái)減少重復(fù)覆蓋,
可是通過(guò)命名約定沒(méi)有強(qiáng)制執(zhí)行,還是存在被新生低級(jí)程序員覆蓋的可能。
在沒(méi)有Symbol之前 采用 Object.freeze 凍結(jié)一個(gè)對(duì)象 也可以做到 一定不會(huì)覆蓋修改屬性的問(wèn)題,但是它帶來(lái)的問(wèn)題就是失去了靈活性,只想一個(gè)屬性不被覆蓋重復(fù),結(jié)果把整個(gè)對(duì)象都凍結(jié)了,這得不償失。
還要Object.defineProperty(obj,'a',{ writable:false }) 這樣通過(guò)屏蔽一個(gè)屬性的可寫性 來(lái)達(dá)到不能覆蓋一個(gè)屬性的目的,不好的地方就是麻煩。用symbol最簡(jiǎn)單。
要避免沖突覆蓋的地方 還有掛在window下的全局方法屬性對(duì)象等,還有全局狀態(tài)等,有很多地方需要保障唯一性。
②定義私有屬性 私有方法等。
const innerState=Symbol('innerState');
class Person {
constructor(){
this[innerState]=' innerState';//這個(gè)內(nèi)部狀態(tài) 如果innerState 它導(dǎo)出,別人就無(wú)法引用到
}
}
export {Person };
③替代字符串 ,規(guī)范代碼,減少錯(cuò)誤
下面弄一個(gè)錯(cuò)誤示范
//訂單已付款
if(orderStatus==='payed'){
//就干點(diǎn)啥
}
//訂單已經(jīng)取消 就干點(diǎn)啥
if(orderStatus==='cancel'){
//就干點(diǎn)啥
}
這個(gè)寫法存在的問(wèn)題是什么呢
1.payed cancel字符串可能在多個(gè)地方使用時(shí) 書寫時(shí)出現(xiàn)錯(cuò)誤;
2.字符串可能會(huì)需要修改,認(rèn)為它表意不準(zhǔn)確
3.別人難以一看就知道 orderStatus到底有哪些狀態(tài)
采用如下寫法 可以完美解決問(wèn)題
const OrderStatus={
payed:Symbol('payed'),
cancel:Symbol('cancel')
}
//訂單已付款
if(orderStatus===OrderStatus.payed){
//就干點(diǎn)啥
}
//訂單已經(jīng)取消 就干點(diǎn)啥
if(orderStatus===OrderStatus.cancel){
//就干點(diǎn)啥
}