JavaScript算术运算符行为复杂:+可拼接字符串或数值相加;-、*、/强制转数字计算;%结果符号随被除数且支持浮点;所有运算受IEEE 754精度限制影响。

JavaScript 中的算术运算符(+、-、*、/、%)看似简单,但实际执行时会涉及类型转换、精度限制和边界情况,理解其真实行为对写出可靠代码很关键。
加法(+):不只是数值相加
加法运算符在 JavaScript 中具有双重身份:既做数值相加,也做字符串拼接。具体行为取决于操作数的类型:
- 若任一操作数为字符串,另一个操作数会被强制转为字符串,然后拼接(如
"5" + 3→"53") - 若两个操作数都是数字(或可转为有效数字),则执行数学加法(如
5 + 3→8) -
null转为0,undefined转为NaN,true/false分别转为1/0 - 对象(如数组、对象字面量)会先调用
toString()转为原始值再参与运算(如[] + {}→"[object Object]")
减法(-)、乘法(*)、除法(/):统一转为数字再计算
这三个运算符只进行数学运算,因此会**强制将操作数转换为数字**(使用 Number() 规则):
-
"5" - "2"→3(字符串被转为数字后相减) -
true * 4→4(true→1) -
null / 2→0(null→0) -
undefined - 1→NaN(undefined→NaN,任何数与NaN运算结果都是NaN) - 空字符串
""→0,非数字字符串如"abc"→NaN
取模(%):求余数,但支持浮点数和负数
取模运算返回“被除数除以除数后的余数”,其结果符号**跟随被除数(左操作数)**,且支持小数:
立即学习“Java免费学习笔记(深入)”;
-
7 % 3→1 -
-7 % 3→-1(不是2) -
7 % -3→1(符号仍由被除数决定) -
5.5 % 2→1.5(JavaScript 允许浮点取模) -
NaN % 3或5 % 0→NaN(无效运算均得NaN)
精度与边界注意事项
JavaScript 使用 IEEE 754 双精度浮点数表示所有数字,这带来一些常见陷阱:
-
0.1 + 0.2 === 0.3为false(实际是0.30000000000000004),比较浮点数建议用差值判断:Math.abs(a - b) - 超过
Number.MAX_SAFE_INTEGER(2^53 - 1)的整数可能丢失精度 -
Infinity和-Infinity参与运算有明确定义(如Infinity / 2 === Infinity,Infinity - Infinity === NaN) -
0 / 0、Infinity / Infinity、0 * Infinity等均返回NaN









