加号(+)在JavaScript中具有数值相加和字符串拼接双重行为,遵循“字符串优先”规则:任意操作数为字符串即触发拼接,且从左到右执行;布尔、null、undefined及对象数组均会被隐式转为字符串参与拼接;金额计算等场景易因类型混用导致静默错误;规避方式包括统一转数字、使用模板字符串、加强类型校验及ESLint拦截。

加号(+)在 JavaScript 中是唯一一个既做数值相加、又做字符串拼接的运算符,它的行为不取决于值本身,而取决于操作数的类型和计算顺序——这正是拼接陷阱最常发生的地方。
加号的“字符串优先”规则
只要参与运算的任意一个操作数是字符串,整个表达式就会进入“拼接模式”,其余操作数全部转为字符串再连接:
- 从左到右执行:`'1' + 2 + 3` → `'123'`(不是`'15'`),因为第一个是字符串,后续全被当作字符串处理
- 数字先算再拼接:`1 + 2 + '3'` → `'33'`(`1+2`先得`3`,再`3 + '3'` → `'33'`)
- 布尔、null、undefined 也会被转成字符串:`true + 'hello'` → `'truehello'`,`null + 'x'` → `'nullx'`,`undefined + 1` → `'undefined1'`
为什么金额计算容易出错
典型场景是后端返回的数字字段混入了字符串类型,前端直接用 `+` 计算:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- `14.8 + '0.5'` → `'14.80.5'`(不是`15.3`)
- `price + discount` 看似合理,但只要其中一个是字符串,结果就变成意外拼接
- 这种错误不会报错,而是静默产生错误字符串,排查时容易绕弯子
对象和数组的拼接更隐蔽
数组和对象没有显式写字符串,但在 `+` 下会自动调用 `toString()`:
立即学习“Java免费学习笔记(深入)”;
- `[1, 2] + [3]` → `'1,23'`(`[1,2].toString()` 是 `'1,2'`,`[3].toString()` 是 `'3'`)
- `[] + {}` → `'[object Object]'`(空数组转为空字符串`''`,对象转为`'[object Object]'`,拼起来就是后者)
- `{} + []` 在某些上下文中会被解析为代码块,实际执行的是 `+[]` → `0`,行为不一致且难复现
怎么避开拼接陷阱
核心是**不依赖 + 的重载逻辑,主动控制类型**:
- 数值计算前统一转数字:
Number(a) + Number(b)或parseFloat(a) + parseFloat(b) - 明确拼接意图时用模板字符串:
${a}${b}比a + b更安全、语义更清 - 对用户输入或接口字段,加一层校验:
if (typeof price !== 'number') price = Number(price) - 用 ESLint 规则
no-plus-assign和no-implicit-coercion提前拦截风险写法

















