symbol的作用

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)啥
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容