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