JavaScript加法运算符(+)根据操作数类型动态决定行为:字符串参与时转为字符串拼接,纯数字时数值相加,其他组合先转数字再相加(失败则NaN)。

JavaScript 中的加法运算符(+)在处理不同数据类型时,会先尝试隐式转换,再进行拼接或数值相加——它不是单纯做数学加法,而是根据操作数类型动态决定行为。
字符串 + 任意类型:全部转成字符串再拼接
只要有一个操作数是字符串,另一个也会被转为字符串,然后执行字符串拼接:
-
"1" + 2→"12"(数字 2 转为字符串 "2") -
true + "hello"→"truehello"(布尔值 true 转为 "true") -
null + "world"→"nullworld"(null 转为 "null") -
undefined + "test"→"undefinedtest"
纯数字 + 数字:正常数值相加
两个操作数都是数字(包括 Number 类型、数字字面量、Number() 转换结果),直接按数学规则相加:
-
1 + 2→3 -
0.1 + 0.2→0.30000000000000004(浮点数精度问题,非类型转换导致) -
Number("5") + 3→8(显式转为数字后相加)
其他类型组合:先转数字再相加(失败则变 NaN)
当两个操作数都不是字符串时,JavaScript 会尝试用 Number() 规则转换它们,再相加。任何一步转换失败(返回 NaN),结果就是 NaN:
立即学习“Java免费学习笔记(深入)”;
-
true + false→1(true→1,false→0) -
"1" - "2"→-1(减号强制转数字,但加号不会) -
{} + []→"[object Object]"(对象和数组都先调用toString(),再拼接) -
{} + {}→"[object Object][object Object]" -
["1"] + ["2"]→"1,2"(数组 toString() 返回逗号分隔字符串)
如何避免意外结果?
明确控制类型,不依赖隐式转换:
- 想拼接字符串:统一用
String(a) + String(b)或模板字面量`${a}${b}` - 想数值相加:先用
Number(a) + Number(b),或parseInt(a) + parseInt(b)(注意进制)、parseFloat(a) + parseFloat(b) - 不确定类型时,可用
typeof或isNaN()做校验 - 严格模式下无法消除隐式转换,但可借助 TypeScript 或 ESLint(如
no-plusplus、no-implicit-coercion)提前预警
不复杂但容易忽略:加号是 JavaScript 中最“重载”的运算符之一,它的行为由类型驱动,而非符号本身。理解转换规则,比死记结果更重要。


















