符号值的转换
类型转换是 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 中其他的非空值那样)。