javascript 中 symbol 转数字会抛出 typeerror。具体做法是调用 number() 构造函数、使用一元加号运算符或进行涉及数字的隐式转换,这些操作都会触发 toprimitive 抽象操作,由于 symbol 没有定义 [symbol.toprimitive] 且无法转换为原始字符串以外的类型,最终导致报错。

Number() 函数转换 Symbol 的行为
使用 Number() 函数显式转换 Symbol 时会直接抛出 TypeError。这是最明确的转换方式,不会尝试任何隐式降级。

const sym = Symbol('test');
console.log(Number(sym)); // Uncaught TypeError: Cannot convert a Symbol value to a number
预期结果:控制台抛出 TypeError,程序中断执行。Number() 构造函数在内部调用 ToPrimitive 输入参数为 Number 提示符,Symbol 对象拒绝此转换并抛出异常。
一元加号运算符转换 Symbol 的行为
使用一元加号 + 运算符转换 Symbol 时同样会抛出 TypeError。该运算符试图将操作数转换为数字,对 Symbol 无效。

const sym = Symbol('test');
console.log(+sym); // Uncaught TypeError: Cannot convert a Symbol value to a number
预期结果:控制台抛出 TypeError。一元加号运算符等价于调用 Number(),因此行为一致。
算术运算中 Symbol 参与数字计算的结果
当 Symbol 参与加法等算术运算时,若另一操作数为数字,也会因隐式转换失败而抛出 TypeError。这验证了混合类型运算中的转换规则。
const sym = Symbol('test');
console.log(sym + 1); // Uncaught TypeError: Cannot convert a Symbol value to a number
预期结果:控制台抛出 TypeError。加法运算首先尝试将 Symbol 转换为原始值,由于数字上下文要求,转换失败。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











