更新時間:2023-08-18 來源:黑馬程序員 瀏覽量:
因?yàn)槊恳粋€Symbol的值都是不相等的,所以將Symbol作為對象的屬性名可以保證屬性不重名。這適用于對象由多個模塊組成的情況,可以防止某一個鍵被意外改寫或覆蓋,示例代碼如下。
<script> let MY NAME = Symbol (); //第1種寫法 let a = {} a[MY_NAME] = 'Hello!'; console.log(a);// 輸出結(jié)果:{ Symbol():“Hello!"} //第2種寫法 let a = { [MY_NAME]: 'Hello!', }; console.log(a);//輸出結(jié)果:{Symbol():“Hello!”} //第3種寫法 let a = (); Object.defineProperty(a, MY_NAME, ( value: 'Hello!')); console.log(a);//輸出結(jié)果:(Symbol():“Hello!“) </script>
上述代碼通過方括號結(jié)構(gòu)或Object.defineProperty 將對象的屬性名指定為一個Symbol 值。使用第1種寫法時,將Symbal值作為對象屬性名要使用方括號而不能用點(diǎn)運(yùn)算符。這是因?yàn)辄c(diǎn)運(yùn)算符后面一直是字符串,導(dǎo)致a的屬性名實(shí)際上是一個字符串,而不是一個Symbol值。使用第2種寫法時,若想在對象內(nèi)部使用Symbal值定義屬性,Symbol 值必須放在方括號中,如果MY_NAME不放在方括中,該屬性的鍵名就是字符串MY_NAME,而不是MY_NAME所代表的那個Symbal值。使用第3種寫法時,會直接在一個a對象上定義一個新屬性,并返回此對象。以上3種方式的輸出結(jié)果相同。