Symbol.for(key) 和Symbol(desc)類似,都是為了產(chǎn)生一個唯一標(biāo)識,不同的是:Symbol.for的key相同,就代表是同一個值;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)換成字符串的,會報錯。undefined和null 沒有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. key為null,則結(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.key為undefined,則結(jié)果和傳入字符串undefined相同-undefined
Symbol.for(undefined);
//輸出:Symbol(undefined)
5.key為function,則轉(zhuǎn)換的Symbol的key為代碼本身
var fun=function bb(){console.log('hello')};
//輸出:Symbol(function bb(){console.log('hello')})
6.key為Array,則轉(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.key為NaN或Infinity,則轉(zhuǎn)換的Symbol的key為調(diào)用Array.toString() - NaN Infinity
Symbol.for(Infinity);
//輸出:Symbol(Infinity)
Symbol.for(NaN);
//輸出:Symbol(NaN)
9.key為Symbol,報錯?。?!
Symbol.for(Symbol.for());
//輸出: Uncaught TypeError: Cannot convert a Symbol value to a string