在 JavaScript 中,+ 操作符既可以用于数字加法,也可以用于字符串拼接。它的行为取决于操作数的类型。
✅ 一句话总结:
当
+操作符的任意一个操作数是字符串类型(或可以被转换为字符串)时,JavaScript 会执行字符串拼接操作;否则,执行数字加法。
🧠 底层机制:依据 ES5 规范
根据 ECMAScript 5 规范,在执行 + 操作符时,JavaScript 引擎会按照以下逻辑处理:
- 对两个操作数执行
ToPrimitive()抽象操作(尝试将对象转换为基本类型); - 如果 任意一个操作数是字符串(或转换后为字符串),则执行 字符串拼接;
- 否则,将两个操作数都转换为数字,执行 数字加法;
✅ 一、字符串拼接的触发条件
1️⃣ 任一操作数是字符串
"123" + 456; // "123456"
123 + "456"; // "123456"
只要其中一个操作数是字符串,另一个也会被隐式转换为字符串,然后进行拼接。
2️⃣ 对象通过 ToPrimitive 转换为字符串
const obj = {
toString() {
return "hello";
}
};
obj + " world"; // "hello world"
obj是对象,先调用ToPrimitive(obj, string);toString()返回字符串,所以整个表达式变成字符串拼接;
3️⃣ 数组转换为字符串(toString())
[1, 2] + "3"; // "1,23"
- 数组
[1, 2]调用toString()→"1,2"; - 然后拼接为
"1,23";
✅ 二、数字加法的触发条件
当两个操作数都不是字符串(或无法转换为字符串)时,JavaScript 会尝试将它们都转换为数字,然后执行加法。
示例:
1 + 2; // 3
true + false; // 1 + 0 = 1
null + 1; // 0 + 1 = 1
✅ 三、对象与基本类型混合操作
示例 1:对象 + 数字
const obj = {
valueOf() {
return 10;
}
};
obj + 20; // 30
obj调用ToPrimitive(obj, number);valueOf()返回10,所以10 + 20 = 30;
示例 2:对象 + 字符串
const obj = {
toString() {
return "hello";
}
};
obj + " world"; // "hello world"
obj被转换为字符串;- 所以执行字符串拼接;
✅ 四、运算符行为对比(+ vs -、*、/)
| 操作符 | 行为 |
|---|---|
+ | 如果任一操作数是字符串 → 拼接;否则 → 数字加法 |
-、*、/、% | 总是尝试将操作数转换为数字进行数学运算 |
示例对比:
1 + "2"; // "12"(字符串拼接)
1 - "2"; // -1(数字运算)
1 * "2"; // 2
1 / "a"; // NaN
✅ 五、一句话总结
+操作符的行为取决于操作数的类型:
- 如果任一操作数是字符串(或能被转换为字符串)→ 字符串拼接;
- 否则 → 数字加法;
- 其他数学运算符(如
-、*、/)始终将操作数转换为数字进行计算。
💡 进阶建议
- 避免使用
new String()、new Number()等包装类型; - 使用
typeof和Object.prototype.toString.call()判断类型; - 使用 TypeScript 可以提前规避类型转换问题;
- 推荐使用
String()或+ ''显式转字符串; - 推荐使用
Number()或+显式转数字;