原生js之Symbol——读Javascript高级程序设计①

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:

 

posted @ 2021-07-22 19:25  举个栗子走天下  阅读(85)  评论(0)    收藏  举报