加号(+)在JavaScript中兼具数值相加与字符串拼接功能,行为取决于操作数类型:任一为字符串则拼接,否则转数字后相加;需警惕隐式转换陷阱,推荐用Number()、String()等显式转换。

JavaScript 中加号(+)是唯一一个既可作数值相加、又可作字符串拼接的运算符,它的行为取决于操作数的类型。当操作数中至少有一个是字符串,加号就会执行字符串拼接;否则才进行数值相加。这种隐式转换容易引发意外结果,关键在于理解其判断逻辑并主动控制类型。
加号运算符的类型判断规则
JavaScript 会按以下顺序处理两个操作数 a + b:
- 先尝试将两个操作数都转为原始值(Primitive),调用
valueOf()或toString()(对象会触发) - 如果任一操作数已经是字符串类型,则把另一个操作数也转为字符串,再拼接
- 否则,尝试将两个操作数都转为数字,再相加(失败则得
NaN)
注意:null 转字符串是 "null",转数字是 0;undefined 转字符串是 "undefined",转数字是 NaN;布尔值 true/false 转数字分别是 1/0。
常见陷阱与对应写法
以下情况看似简单,却常因隐式转换出错:
立即学习“Java免费学习笔记(深入)”;
-
1 + "2"→"12"(数字被转成字符串拼接) -
"1" + 2 + 3→"123"(从左到右,第一个+触发字符串模式,后续全按字符串处理) -
1 + 2 + "3"→"33"(前两个数先相加得3,再与字符串拼接) -
+"1" + +"2"→3(一元加号强制转数字,再相加)
推荐的显式类型处理方式
避免依赖隐式转换,用明确的方式控制行为:
- 想做数值相加:先用
Number()、parseInt()、parseFloat()或一元加号+转数字,再相加
例:Number(a) + Number(b)、(+a) + (+b) - 想做字符串拼接:统一用
String()或模板字面量转字符串
例:String(a) + String(b)、${a}${b} - 对用户输入等不确定值,建议先校验再转换
例:const num = Number(input); if (isNaN(num)) throw new Error("Not a number");
调试时快速识别类型问题
遇到结果不符合预期,可临时加类型检查:
- 用
typeof看基础类型:typeof x - 用
Object.prototype.toString.call(x)看更精确类型(如[object Array]) - 在加法前打印操作数和它们的
typeof,比如:console.log(a, typeof a, b, typeof b)
不复杂但容易忽略。


















