跳到主要内容

四则运算符:什么时候会隐式转数字?+ 为什么最特殊?

面试速答(30 秒版 TL;DR)

  • - * / **(以及一元 +x-x)基本都走 ToNumber/ToNumeric:会把操作数转成数字再算。
  • 二元 + 最特殊:可能做字符串拼接,也可能做数值加法
  • BigInt 规则:不能和 Number 混算(如 1n + 1 会抛 TypeError)。

二元 +:拼接 vs 加法

口诀:

  • 两边先 ToPrimitive
  • 有字符串就拼接(另一边 ToString)
  • 否则做加法(两边 ToNumber)
1 + "2"; // "12"
"1" + 2; // "12"
true + 1; // 2
null + 1; // 1 (null -> 0)
undefined + 1; // NaN
[] + 1; // "1" ([] -> "")

- * /:强制走数值语义

"10" - 1; // 9
"10" * 2; // 20
"10" / 2; // 5

[] - 1; // -1 ([] -> "" -> 0)
[2] * 3; // 6 ([2] -> "2" -> 2)
({}) * 2; // NaN({} -> "[object Object]" -> NaN)

BigInt:不要混用

1n + 2n; // 3n
1n * 2n; // 2n
// 1n + 1; // TypeError: Cannot mix BigInt and other types

面试口径:

  • BigInt 是另一套数值域,四则运算要求两边同为 BigInt。
  • 需要混用时要显式转换:Number(1n)BigInt(1)(注意转换可能丢精度或报错)。

常见追问:为什么 NaN 这么“传染”?

NaN 表示“不是一个可表示的数值结果”,参与进一步数值运算基本都会得到 NaN

NaN + 1; // NaN
NaN * 2; // NaN