Symbol.for(key)
和Symbol(desc)
类似,都是为了产生一个唯一标识,不同的是:Symbol.for
的key
相同,就代表是同一个值;Symbol()
的desc
相同,也不是同一个值;本文只谈Symbol.for。
一、语法规则
语法引自MDN:
Symbol.for(key);
key:一个字符串,作为 symbol 注册表中与某 symbol 关联的键(同时也会作为该 symbol 的描述)
返回值:返回由给定的 key 找到的 symbol,否则就是返回新创建的 symbol。
二、规则的理解
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是红色,火狐是粉色(笑)。和字符串的打印方式不一样??发现自己犯了个低级错误---Symbol.for()
返回的是Symbol
类型的数据啊,当然不是字符串了。。。那怎么验证key是不是字符串呢?发现自己钻牛角尖了,调用toString()
返回的自然是按字符串处理了。我如果就想在toString()里返回数字呢?那就按内部机制转。
2. key
为null
,则结果和传入字符串null相同-null
Symbol.for(null);
//输出:Symbol(null)
3. key
为""
,则转换的Symbol的key为空白,和key为空数组相同
Symbol.for("");
//输出:Symbol()
Symbol.for([]);
//输出:Symbol()
因为[].toString()===""
,所以这里,空数组可以看出空字符串。
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()返回数字
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
,报错!!!
Symbol.for(Symbol.for());
//输出: Uncaught TypeError: Cannot convert a Symbol value to a string