Symbol.for使用心得

Symbol.for(key)Symbol(desc)類似,都是為了產(chǎn)生一個唯一標(biāo)識,不同的是:Symbol.forkey相同,就代表是同一個值;Symbol()desc相同,也不是同一個值;本文只談Symbol.for。

一、語法規(guī)則

語法引自MDN:

Symbol.for(key);

key:一個字符串,作為 symbol 注冊表中與某 symbol 關(guān)聯(lián)的鍵(同時也會作為該 symbol 的描述)

返回值:返回由給定的 key 找到的 symbol,否則就是返回新創(chuàng)建的 symbol。

二、規(guī)則的理解

Symbol.for(key)通過key來判斷其唯一性,key必須是字符串,不是字符串的,調(diào)用toString()轉(zhuǎn)換為字符串,如果無法轉(zhuǎn)換成字符串的,會報錯。undefinednull 沒有toString(),但是不會報錯,當(dāng)做字符串'undefined''null'處理。

三、注意事項(xiàng)

1.key不是必須的,默認(rèn)為字符串undefined

先看一組代碼:

Symbol.for() === Symbol.for(undefined);
//輸出:true

Symbol.for() === Symbol.for('undefined');
//輸出:true

var obj={};
Symbol.for() === Symbol.for(obj.dddd);
//輸出:true

console.log(Symbol.for())

從上面可以初步判定,Symbol.for()默認(rèn)的key是字符串'undefined',打印一下:

console.log(Symbol.for());
//輸出:Symbol(undefined)

chrome和火狐都會打印同一色的Symbol(undefined),只不過chrome是紅色,火狐是粉色(笑)。和字符串的打印方式不一樣??發(fā)現(xiàn)自己犯了個低級錯誤---Symbol.for()返回的是Symbol類型的數(shù)據(jù)啊,當(dāng)然不是字符串了。。。那怎么驗(yàn)證key是不是字符串呢?發(fā)現(xiàn)自己鉆牛角尖了,調(diào)用toString()返回的自然是按字符串處理了。我如果就想在toString()里返回數(shù)字呢?那就按內(nèi)部機(jī)制轉(zhuǎn)。

2. keynull,則結(jié)果和傳入字符串null相同-null

Symbol.for(null);
//輸出:Symbol(null)

3. key"",則轉(zhuǎn)換的Symbol的key為空白,和key為空數(shù)組相同

Symbol.for("");
//輸出:Symbol()
Symbol.for([]);
//輸出:Symbol()

因?yàn)?code>[].toString()==="",所以這里,空數(shù)組可以看出空字符串。

4.keyundefined,則結(jié)果和傳入字符串undefined相同-undefined

Symbol.for(undefined);
//輸出:Symbol(undefined)

5.keyfunction,則轉(zhuǎn)換的Symbol的key為代碼本身

var fun=function bb(){console.log('hello')};
//輸出:Symbol(function bb(){console.log('hello')})

6.keyArray,則轉(zhuǎn)換的Symbol的key為調(diào)用Array.toString()

Symbol.for([1,'a',{attr:'attr'}]);
//輸出:Symbol(1,a,[object Object])

[1,'a',{attr:'attr'}].toString()
//輸出:"1,a,[object Object]"

7. key對象,則調(diào)用toString()轉(zhuǎn)換,如果沒有toSting(),則key為[object Object]


//有toSting()
Symbol.for({a:1,toString(){return 'hello'}});
//輸出:Symbol(hello)

//toSting()返回數(shù)字
Symbol.for({a:1,toString(){return 111}});
//輸出:Symbol(111)

//沒有toString()
Symbol.for({a:1});
//輸出:Symbol([object Object])

//空對象
Symbol.for({});
//輸出:Symbol([object Object])

8.keyNaNInfinity,則轉(zhuǎn)換的Symbol的key為調(diào)用Array.toString() - NaN Infinity

Symbol.for(Infinity);
//輸出:Symbol(Infinity)

Symbol.for(NaN);
//輸出:Symbol(NaN)

9.keySymbol,報錯?。?!

Symbol.for(Symbol.for());
//輸出: Uncaught TypeError: Cannot convert a Symbol value to a string
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 夜鶯2517閱讀 128,136評論 1 9
  • 版本:ios 1.2.1 亮點(diǎn): 1.app角標(biāo)可以實(shí)時更新天氣溫度或選擇空氣質(zhì)量,建議處女座就不要選了,不然老想...
    我就是沉沉閱讀 7,424評論 1 6
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,832評論 28 54
  • 兔子雖然是枚小碩 但學(xué)校的碩士四人寢不夠 就被分到了博士樓里 兩人一間 在學(xué)校的最西邊 靠山 兔子的室友身體不好 ...
    待業(yè)的兔子閱讀 2,766評論 2 9

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