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) 专享 尊重版权
   142   143   144   145   146   147   148   149   150   151   152