加法运算符会触发字符串拼接或隐式类型转换,导致1+"2"为"12"、1+null为1;减乘除将操作数转数字,空字符串变0,true变1,数组转换存风险;浮点数计算存在精度误差,0.1+0.2≠0.3,应使用误差范围比较。
JavaScript的算术运算符在执行时会进行隐式类型转换,这种机制虽然方便,但也容易引发一些意料之外的问题。理解这些陷阱有助于写出更可靠的代码。
加法运算符是唯一一个既用于数值相加又用于字符串拼接的操作符。当操作数中至少有一个是字符串时,JavaScript会将另一个操作数也转换为字符串。
常见问题:
建议:如果预期是数值计算,先用 Number() 或一元加号 +value 显式转换。
这些运算符总是尝试将操作数转换为数字,转换失败则返回 NaN。
典型陷阱:
注意:看似“合理”的表达式可能掩盖了类型错误,比如把本应是
数字的输入当作数组处理。
即使类型正确,JavaScript的浮点数基于IEEE 754标准,导致某些小数无法精确表示。
例如:
解决方案:比较浮点数时使用误差范围(如 Math.abs(a - b) ),或先转换为整数计算。
算术运算中涉及 null、undefined、NaN、Infinity 时行为特殊:
这类结果一旦产生,会沿着计算链条传播,难以排查。
基本上就这些。关键是在写算术表达式时,别依赖隐式转换的“聪明”,尤其是来自用户输入或接口数据时,先做类型判断或显式转换更安全。