符号值的转换

类型转换是 JS 语言重要的一部分,能够非常灵活地将一种数据类型转换为另一种。然而符号类型在进行转换时非常不灵活,因为其他类型缺乏与符号值的合理等价,尤其是符号值无法被转换为字符串值或数值。因此将符号作为属性所达成的效果,是其他类型所无法替代的。

本章之前的例子使用了 console.log() 来展示符号值的输出,能这么做是由于自动调用了符号的 String() 方法来产生输出。你也可以直接调用 String() 方法来获取相同结果,例如:

let uid = Symbol.for("uid"),
    desc = String(uid);

console.log(desc);              // "Symbol(uid)"

String() 方法调用了 uid.toString() 来获取符号的字符串描述信息。但若你想直接将符号转换为字符串,则会引发错误:

let uid = Symbol.for("uid"),
    desc = uid + "";            // error!

uid 与空字符串相连接,会首先要求把 uid 转换为一个字符串,而这会引发错误,从而阻止了转换行为。

相似地,你不能将符号转换为数值,对符号使用所有数学运算符都会引发错误,例如:

let uid = Symbol.for("uid"),
    sum = uid / 1;            // error!

此例试图把符号值除以 1,同样引发了错误。无论对符号使用哪种数学运算符都会导致错误,但使用逻辑运算符则不会,因为符号值在逻辑运算中会被认为等价于 true(就像 JS 中其他的非空值那样)。