JavaScript中减号和乘号会强制将操作数转为数字(ToNumber),失败则得NaN;加号例外,遇字符串优先拼接。

JavaScript 中,减号(-)和乘号(*)在参与运算时,会**强制将操作数尝试转为数字**,这是它们与加号(+)的关键区别:加号遇到字符串会优先做拼接,而减、乘、除、取余等算术运算符**没有字符串逻辑,必须走 ToNumber 转换流程**。
减号(-)触发隐式转换的原理
一元减号(如 -str)或二元减号(如 a - b)都会对操作数调用内部抽象操作 ToNumber():
- 空字符串
""→0 -
"123"→123 -
" 42 "→42(自动忽略首尾空白) -
"abc"→NaN(无法解析为有效数字) -
null→0(ToNumber(null)定义为 0) -
undefined→NaN
示例:
"42" - 0 // 42<br>"0x10" - 0 // 16(支持十六进制字符串)<br>-" 7.5 " // -7.5<br>-"hello" // NaN
立即学习“Java免费学习笔记(深入)”;
乘号(*)同样走 ToNumber 路径
乘法运算符要求两个操作数都为数字,因此左右操作数都会被 ToNumber() 处理,规则与减号完全一致:
-
"3" * "4"→12 -
2 * " 5.5 "→11 -
"0xf" * 1→15(识别十六进制字面量) -
"2" * undefined→NaN
注意:"2" * "" 得 0,因为 "" 转数字是 0,不是空值错误。
和其他算术运算符行为一致
除号(/)、取余(%)、一元加号(+)也都使用 ToNumber:
-
+"123"是最常用的显式字符串转数字写法,本质就是一元加号触发ToNumber -
"10" / "2"→5 -
"10" % "3"→1
它们和减号、乘号一样,不关心原始类型,只按规范执行数字转换——失败则得 NaN,成功则继续运算。
为什么加号(+)是例外?
因为加号有**双语义**:既能数值相加,也能字符串拼接。当至少一个操作数是字符串时,JS 选择字符串连接;只有两个都是原始数字(或可转为数字且非字符串)时,才做数值相加。这导致:
"2" + "3" // "23"(字符串拼接)<br>"2" - "3" // -1(强制转数字后相减)
所以想安全转数字,用 -str、+str 或 str * 1 都可以,但语义上 +str 最清晰,-str 和 str * 1 属于“借运算触发转换”的技巧。


















