数组在加法运算中自动转为字符串再拼接,如[]+[]→""、1+[2]→"12";若需数值计算须显式转换,如reduce求和或number()转单元素数组。

当数组参与加法运算(+)时,JavaScript 会按规则自动将其转为原始值,再根据另一操作数的类型决定最终是拼接还是相加。整个过程不依赖开发者显式调用,但逻辑清晰、步骤固定。
数组先被转成字符串
加法运算中若任一操作数是字符串,另一个操作数会被强制转为字符串后拼接。而数组本身不是字符串,所以引擎会调用 ToPrimitive(array, Number) 尝试转为原始值——默认 hint 是 Number,因此先调用 valueOf()。
但数组的 valueOf() 返回的是数组自身(对象),不是原始值,于是继续调用 toString()。数组的 toString() 等价于 .join(","):
-
[].toString()→"" -
[0].toString()→"0" -
[1, 2, 3].toString()→"1,2,3" -
[null, undefined].toString()→", "(两个逗号间是空字符串)
数字 + 数组 → 先转数组为字符串再拼接
只要左边或右边有一个是数字,另一个是数组,就会触发上述 toString() 转换,然后走“字符串拼接”路径:
-
1 + []→1 + ""→"1" -
5 + [2]→5 + "2"→"52" -
"hello" + [1, 2]→"hello" + "1,2"→"hello1,2"
注意:这里没有“先转数字再相加”,因为加法一旦发现字符串,就放弃数值运算,全程走字符串逻辑。
两个数组相加?也是拼字符串
[] + []、[1] + [2, 3] 这类表达式中,两个操作数都是对象,引擎对左右都执行 ToPrimitive(hint 默认为 Number),结果都是调用 toString():
-
[] + []→"" + ""→"" -
[1] + [2, 3]→"1" + "2,3"→"12,3" -
[0, false] + [null]→"0,false" + ""→"0,false"
想让数组参与数值计算?得手动干预
JavaScript 不会把 [1, 2] 当作数字 12 或求和 3 ——那是业务逻辑,不是语言规则。如果真需要数值结果,必须显式转换:
- 求和:
[1, 2, 3].reduce((a, b) => a + b, 0) - 转单个数字(仅含一项):
Number([5])→5,但Number([1,2])→NaN - 避免隐式转换:用严格相等
===、显式String()或Number()替代+
不复杂但容易忽略:数组在加法里永远不“算数”,只“说话”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











