四则运算符:什么时候会隐式转数字?+ 为什么最特殊?
面试速答(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