Symbol类型
首先这是数据类型,和Number、String等一样,但是不同的是Symbol()函数不能与 new 关键字一起作为构造函数使用。
Symbol函数的出现是为了解决重名的问题,举一个简单的例子。
let a = 'Jack';
let b = 'Jack';
console.log(a == b);
很明显答案为true,但是世界上肯定会有两个人都叫Jack对吧,那如果我们需要a的数据,如何避免拿成b的呢,一般我们的方法都是加上前缀或者后缀来区分,比如Jack1、Jack2……,但是Symbol类型可以帮助我们解决这个问题。
let a = Symbol('Jack');
let b = Symbol('Jack');
console.log(a == b); // false
-
符号的基本使用方法
符号类型使用函数
Symbol()
初始化,不能使用new
,它并不是对象!let temp = Symbol(); console.log(typeof temp); // symbol
这样你就声明了一个独一无二的符号。当然你也可以给这个函数传入参数。
let temp = Symbol('foo'); console.log(temp); // Symbol(foo)
-
使用全局符号注册表
Symbol.for()
对每个字符串键都执行幂等操作。第一次使用某个字符串调用时,它会检查全局运行时注册表,发现不存在对应的符号,于是就会生成一个新符号实例并添加到注册表中。后续使用相同 字符串的调用同样会检查注册表,发现存在与该字符串对应的符号,然后就会返回该符号实例。举个例子
let a = Symbol.for('foo'); let b = Symbol.for('foo'); console.log(a == b); // true
但是使用
Symbol()
与Symbol.for()
创建出来的符号是不相同的let a = Symbol.for('foo'); let b = Symbol('foo'); console.log(a == b); // false
注册表中使用的键同时也会被用作符号描述
let a = Symbol.for(); console.log(a); // Symbol(undefined)
还可以使用 Symbol.keyFor()来查询全局注册表,这个方法接收符号,返回该全局符号对应的字 符串键。如果查询的不是全局符号,则返回 undefined。
let a = Symbol.for('foo'); console.log(Symbol.keyFor(a)); // foo