Symbol.for(key)
和Symbol(desc)
類似胃夏,都是為了產(chǎn)生一個唯一標識,不同的是:Symbol.for
的key
相同照雁,就代表是同一個值;Symbol()
的desc
相同,也不是同一個值萍诱;本文只談Symbol.for污呼。
一、語法規(guī)則
語法引自MDN:
Symbol.for(key);
key:一個字符串籍凝,作為 symbol 注冊表中與某 symbol 關聯(lián)的鍵(同時也會作為該 symbol 的描述)
返回值:返回由給定的 key 找到的 symbol饵蒂,否則就是返回新創(chuàng)建的 symbol酱讶。
二、規(guī)則的理解
Symbol.for(key)
通過key
來判斷其唯一性渊迁,key
必須是字符串软免,不是字符串的,調用toString()
轉換為字符串漓骚,如果無法轉換成字符串的榛泛,會報錯曹锨。undefined
和null
沒有toString()
,但是不會報錯,當做字符串'undefined'
和'null'
處理齐鲤。
三椒楣、注意事項
1.key
不是必須的,默認為字符串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()
默認的key是字符串'undefined',打印一下:
console.log(Symbol.for());
//輸出:Symbol(undefined)
chrome和火狐都會打印同一色的Symbol(undefined)
,只不過chrome是紅色炭庙,火狐是粉色(笑)焕蹄。和字符串的打印方式不一樣?嘲驾?發(fā)現(xiàn)自己犯了個低級錯誤---Symbol.for()
返回的是Symbol
類型的數(shù)據(jù)啊迹卢,當然不是字符串了徒仓。。症见。那怎么驗證key是不是字符串呢殃饿?發(fā)現(xiàn)自己鉆牛角尖了,調用toString()
返回的自然是按字符串處理了遵蚜。我如果就想在toString()里返回數(shù)字呢吭净?那就按內(nèi)部機制轉肴甸。
2. key
為null
,則結果和傳入字符串null相同-null
Symbol.for(null);
//輸出:Symbol(null)
3. key
為""
友扰,則轉換的Symbol的key為空白庶柿,和key為空數(shù)組相同
Symbol.for("");
//輸出:Symbol()
Symbol.for([]);
//輸出:Symbol()
因為[].toString()===""
,所以這里澳泵,空數(shù)組可以看出空字符串。
4.key
為undefined
腊敲,則結果和傳入字符串undefined相同-undefined
Symbol.for(undefined);
//輸出:Symbol(undefined)
5.key
為function
击喂,則轉換的Symbol的key為代碼本身
var fun=function bb(){console.log('hello')};
//輸出:Symbol(function bb(){console.log('hello')})
6.key
為Array
,則轉換的Symbol的key為調用Array.toString()
Symbol.for([1,'a',{attr:'attr'}]);
//輸出:Symbol(1,a,[object Object])
[1,'a',{attr:'attr'}].toString()
//輸出:"1,a,[object Object]"
7. key
為對象
碰辅,則調用toString()
轉換懂昂,如果沒有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.key
為NaN
或Infinity
,則轉換的Symbol的key為調用Array.toString()
- NaN
Infinity
Symbol.for(Infinity);
//輸出:Symbol(Infinity)
Symbol.for(NaN);
//輸出:Symbol(NaN)
9.key
為Symbol
没宾,報錯A璞颉!循衰!
Symbol.for(Symbol.for());
//輸出: Uncaught TypeError: Cannot convert a Symbol value to a string