Page 147 - 你不知道的JavaScript(下卷)
P. 147
下面是创建 symbol 的过程:
var sym = Symbol( "some optional description" );
typeof sym; // "symbol"
以下几点需要注意。
• 不能也不应该对 Symbol(..) 使用 new。它并不是一个构造器,也不会创建一个对象。
• 传给 Symbol(..) 的参数是可选的。如果传入了的话,应该是一个为这个 symbol 的用途
给出用户友好描述的字符串。
• typeof 的输出是一个新的值 ("symbol"),这是识别 symbol 的首选方法。
如果提供了描述的话,它只被用作为这个符号的字符串表示:
sym.toString(); // "Symbol(some optional description)"
如同原生字符串值不是 String 的实例一样,symbol 也不是 Symbol 的实例。如果出于某种
原因想要构造一个 symbol 值的装箱封装对象形式,可以使用下面的方法:
sym instanceof Symbol; // false
var symObj = Object( sym );
symObj instanceof Symbol; // true
symObj.valueOf() === sym; // true
这段代码中的 symObj 也可以换作 sym;两种形式都在所有使用 symbol 的场
合适用。需要使用装箱封装对象形式(symObj)而不是原生形式(sym)的情
况很少。和针对其他原生类型的建议一样,最好使用 sym 代替 symObj。
符号本身的内部值——称为它的名称(name)——是不在代码中出现且无法获得的。可以
把这个符号值想象为一个自动生成的、(在应用内部)唯一的字符串值。
但如果这个值是隐藏的且无法获得,那么符号的存在意义是什么呢?
符号的主要意义是创建一个类 ( 似 ) 字符串的不会与其他任何值冲突的值。所以,考虑使
用一个符号作为事件名的常量表示的例子:
const EVT_LOGIN = Symbol( "event.login" );
然后在需要像 "event.login" 这样的一般字符串字面量的地方就可以使用 EVT_LOGIN 了:
evthub.listen( EVT_LOGIN, function(data){
124 | 第 2 章
图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权