Symbol()
使用 Symbol() 标识的变量,虽然内容一样,、但该变量是独一无二的,就比如下面的
let s2=Symbol('你好');
let s3=Symbol('你好');
console.log(s2===s3);//false
可以把 Symbol() 看成一个标识,一个班级中有两个人的名字一样,但是学号不一样,这个学号可以理解为是 Symbol() 声明变量时给的
Symbol.for()
let s1=Symbol.for('foo');
let s2=Symbol.for('foo');
console.log(s1===s2);//true
//s1和s2都是Symbol值,但是它们都是同样参数的Symbol.for()方法生成的,所以实际上是同一个值
使用 Symbol.for() 声明的变量可以重复使用
Symbol.for() 接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个该字符串为名称的Symbol值
Symbol() 与 Symbol.for() 的区别
Symbol.for()与Symbol()这两种写法,都会生成新的Symbol,它们的区别是,前者会被登记在全局环境中供搜索,后者不会;Symbol.for()不会每次调用就返回一个新的Symbol类型的值,而是先检查给定的参数字符串是否已存在,如果不存在才会新建一个并返回一个该字符串为名称的Symbol值
比如:调用Symbol.for('cat') 30次,每次都会返回同一个Symbol值,但是调用Symbol('cat') 30次,会返回30个不同的Symbol值
Symbol.keyFor()
let s1=Symbol.for('foo');
let s2=Symbol.keyFor(s1);
console.log(s2);//foo
let s3=Symbol('foo');
let s4=Symbol.keyFor(s3);
console.log(s4);//undefined
Symbol.keyFor() 方法返回一个已登记的Symbol类型的值
变量s1属于登记在全局环境下的Symbol值,所以使用Symbol.keyFor()方法输出foo
变量s1属于未登记在全局环境下的Symbol值,所以使用Symbol.keyFor()方法输出undefined