为什么JavaScript中[1,2] + [3,4]的结果是"1,23,4"?

416

我想将一个数组的元素添加到另一个数组中,所以我尝试了这个:

[1,2] + [3,4]

它做出了回应:

"1,23,4"

发生了什么?


30
啊哈哈,虐待狂的面试官甚至可以问像这样的问题 - [1,2] + [5,6,7][1,2] 会返回什么。为什么? - shabunc
9
在Firebug中,自alert('crap')之后,我认为[1,2] + [3,4]是最经常被评估的表达式。 - okeen
6
想发笑吗?试试 [] + [], {} + [], {} + {} 和 [] + {}。 - Intrepidd
1
@shabunc - 能否解释一下为什么 [5,6,7][1,2] 的结果是 7,因为它使用了第二个数组中的最后一个元素。O.o - vsync
1
@vsync - 我不太擅长使用“care to explain”这个结构,因为我不是母语使用者。所以,你基本上是在问为什么?因为在“取索引”上下文中,逗号分隔值列表解析为最后一个。 - shabunc
显示剩余3条评论
14个回答

8

0
自从ES6以来,我们可以使用扩展运算符做一些类似于我们想要的事情:
[...[1, 2], ...[3, 4]]

给出:

[1, 2, 3, 4]

它也适用于命名变量:

const a = [1, 2];
const b = [3, 4];
const array = [...a, ...b];

会得到相同的结果。


0

这里有一些答案解释了为什么会出现意外的不期望输出('1,23,4'),还有一些解释了如何获得他们认为是期望的输出([1,2,3,4]),即数组连接。然而,期望的输出的性质实际上有些模糊,因为原始问题只是简单地陈述了“我想将一个数组的元素添加到另一个数组中...”。那可能意味着数组连接,但也可能意味着元组加法(例如herehere),即将一个数组中元素的标量值与第二个数组中相应元素的标量值相加,例如将[1,2][3,4]组合成[4,6]

假设两个数组具有相同的元数/长度,这里有一个简单的解决方案:

const arr1 = [1, 2];
const arr2 = [3, 4];

const add = (a1, a2) => a1.map((e, i) => e + a2[i]);

console.log(add(arr1, arr2)); // ==> [4, 6]


-1

只使用简单的“+”符号得到的另一个结果将是:

[1,2]+','+[3,4] === [1,2,3,4]

所以像这样的东西应该可以工作(但是!):

var a=[1,2];
var b=[3,4];
a=a+','+b; // [1,2,3,4]

...但它会将变量a从数组转换为字符串!记住这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接