javascript算术运算严格按运算符语义分路径处理:+优先字符串拼接,其余运算符强制转数字;对象须先toprimitive再依hint转换;基础值如true→1、null→0、undefined→nan。

JavaScript 在算术运算中执行隐式类型转换,并非随意而为,而是严格按运算符语义和操作数类型分路径处理。核心在于:+ 有字符串拼接优先权,其余算术运算符(−、*、/、%)只走数字路线;对象必须先转原始值,再依上下文决定怎么转。
+ 运算符:字符串拼接优先
只要任意一个操作数是字符串,整个表达式就进入字符串路径,其余操作数全部调用 ToString 转为字符串后拼接:
-
"1" + 2→"12"(2 转成 "2") -
true + "x"→"truex"(true 转成 "true") -
[] + {}→"[object Object]"([] → "",{} → "[object Object]") -
1 + 2 + "3"是左结合:(1 + 2) + "3"→3 + "3"→"33"
−、*、/、% 运算符:强制转数字
这些运算符不支持拼接,统一调用 ToNumber 尝试把每个操作数转成有效数字;失败即得 NaN,且不会回退:
-
"6" - "2"→4(两边都成功转数字) -
null - 1→-1(null → 0) -
undefined * 2→NaN(undefined → NaN) -
"abc" / 2→NaN("abc" 无法解析为数字)
对象参与运算:先 ToPrimitive,再看上下文
对象不能直接参与算术运算,必须先通过 [[ToPrimitive]] 获取原始值。引擎根据 hint 决定调用顺序:
- 数学运算(如
-、*)默认 hint 是"number":先valueOf(),失败再toString() - 字符串拼接(
+遇字符串)默认 hint 是"string":先toString() -
[1] + [2]→"12"(数组 toString 得 "1" 和 "2") -
{} - []→NaN({} 的 valueOf() 返回自身,toString() 得 "[object Object]",ToNumber 失败)
基础值的固定映射
部分原始值在 ToNumber 中有确定结果,无需尝试解析:
-
true→1,false→0 -
null→0 -
undefined→NaN -
""或仅空白字符(如"\t\n ")→0 -
"123"→123," 45 "→45,"12px"→NaN











