Symbol.for使用心得

Symbol.for(key)Symbol(desc)类似,都是为了产生一个唯一标识,不同的是:Symbol.forkey相同,就代表是同一个值;Symbol()desc相同,也不是同一个值;本文只谈Symbol.for

一、语法规则

语法引自MDN:

Symbol.for(key);

key:一个字符串,作为 symbol 注册表中与某 symbol 关联的键(同时也会作为该 symbol 的描述)

返回值:返回由给定的 key 找到的 symbol,否则就是返回新创建的 symbol。

二、规则的理解

Symbol.for(key)通过key来判断其唯一性,key必须是字符串,不是字符串的,调用toString()转换为字符串,如果无法转换成字符串的,会报错。undefinednull 没有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. keynull,则结果和传入字符串null相同-null

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

3. key"",则转换的Symbol的key为空白,和key为空数组相同

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

因为[].toString()==="",所以这里,空数组可以看出空字符串。

4.keyundefined,则结果和传入字符串undefined相同-undefined

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

5.keyfunction,则转换的Symbol的key为代码本身

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

6.keyArray,则转换的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.keyNaNInfinity,则转换的Symbol的key为调用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

你可能感兴趣的:(Symbol.for使用心得)