加号(+)优先字符串拼接,减号(-)强制数值运算;一元加号和减号仅转类型。加号遇字符串即转串拼接,减号任一操作数转数失败即NaN,故加号多义易错,减号单一严格。

加号和减号在 JavaScript 中对隐式类型转换的处理逻辑完全不同:加号(+)优先拼接,减号(-)只做数值运算。
加号(+):字符串优先,自动转串拼接
只要有一个操作数是字符串,整个表达式就按字符串拼接处理,另一个操作数会被 ToString 转为字符串,再连接:
-
5 + "3"→"53"(数字 5 转成字符串"5") -
"hello" + true→"hellotrue"(true转成"true",不是"1") -
null + "x"→"nullx"(null转为字符串"null") -
0 + ""→"0"(空字符串仍是字符串,0 转为"0")
减号(-):强制转数,失败即 NaN
减号没有拼接功能,所有操作数都会尝试用 ToNumber 转为数字;任一操作数无法转为有效数字,结果就是 NaN:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
5 - "3"→2("3"转为3) -
"10" - "2"→8(两边都转数字后相减) -
10 - "abc"→NaN("abc"转数字失败) -
"" - 1→-1(空字符串转为0,再算0 - 1) -
true - false→1(true→1,false→0)
一元加号和一元减号也不同
它们不涉及拼接,只负责类型转换:
立即学习“Java免费学习笔记(深入)”;
-
+"123"→123(字符串转数字) -
+" 42 "→42(忽略首尾空白) -
-"10"→-10(先转数字,再取负) -
-"abc"→NaN(转数字失败,再取负仍为NaN)
为什么容易出错?关键在“角色唯一性”
加号身兼两职(拼接 / 相加),引擎靠类型决定行为;减号职责单一(只算数),所以更“严格”:
- 写
age + "岁"是想拼字符串 → 安全 - 写
price - discount却传入字符串"100"和"20"→ 看似能算,但若其中一个是"20%"就崩了 - 想确保数值运算?用
Number(x)或+x先显式转类型

















