Symbol()函数不能用做构造函数,与new关键字一起使用。这样做是为了避免创建符号包装对象,像使用Boolean、String、Number那样,他们都支持构造函数且可用于初始化包含原始值的包装对象:
使用全局符号注册表
如果运行时的不同部分需要共享和重用符号实例,那么可以用一个字符串作为键,在全局符号注册表中创建并重用符号。为此,需要使用Symbol.for()方法:
let hehe = Symbol.for('foo'); //创建新符号
let demo = Symbol.for('foo'); //重用已有符号
console.log(hehe===demo); //true
注意:即使采用相同的符号描述,在全局注册表中定义的符号跟使用Symbol()定义的符号也并不等同:
let localSymbol = Symbol('foo');
let globalSymbol = Symbol.for('foo')
console.log(localSymbol === globalSymbol) //false
全局注册表中的符号必须使用字符串键来创建,因此作为参数传给Symbol.for()的任何值都会被转为字符串。
还可以使用Symbol.keyFor()来查询全局注册表,这个方法接收符号,返回该全局符号对应的字符串键。如果查询的不是全局符号,则返回undefined.
// 创建全局符号
let s = Symbol.for('foo');
console.log(Symbol.keyFor(s)); // foo
//创建普通符号
let s2 = Symbol('bar');
console.log(Symbol.keyFor(s2)) // undefined
注意:如果传给Symbol.keyFor()的不是符号,则该方法抛出TypeError: