我想将一个数组的元素添加到另一个数组中,所以我尝试了这样做:
[1,2] + [3,4]
它的答复是:
"1,23,4"
这是怎么回事?
我想将一个数组的元素添加到另一个数组中,所以我尝试了这样做:
[1,2] + [3,4]
它的答复是:
"1,23,4"
这是怎么回事?
当前回答
没有为数组定义+运算符。
Javascript将数组转换为字符串并将它们连接起来。
更新
由于这个问题和我的回答得到了很多关注,我觉得对+操作符的一般行为有一个概述是有用的和相关的。
所以,开始吧。
除了E4X和特定于实现的东西,Javascript(从ES5开始)有6种内置数据类型:
未定义的 零 布尔 数量 字符串 对象
注意,虽然typeof返回Null对象和可调用对象的函数有点令人困惑,但Null实际上不是一个对象,严格来说,在符合规范的Javascript实现中,所有函数都被认为是对象。
这是对的——Javascript没有原始数组;只有一个名为Array的对象的实例,并使用一些语法糖来减轻痛苦。
更令人困惑的是,诸如new Number(5)、new Boolean(true)和new String("abc")等包装器实体都是对象类型,而不是人们可能期望的数字、布尔值或字符串。然而,对于算术运算符,数字和布尔值表现为数字。
容易吧,对不对?了解了所有这些之后,我们可以进入概述本身。
根据操作数类型,不同的+结果类型
|| undefined | null | boolean | number | string | object |
=========================================================================
undefined || number | number | number | number | string | string |
null || number | number | number | number | string | string |
boolean || number | number | number | number | string | string |
number || number | number | number | number | string | string |
string || string | string | string | string | string | string |
object || string | string | string | string | string | string |
*适用于Chrome13, FF6, Opera11和IE9。检查其他浏览器和版本留给读者练习。
注意:正如CMS所指出的,对于某些情况下的对象,如数字,布尔和自定义对象,+运算符不一定会产生字符串结果。它可以根据对象到原语转换的实现而变化。例如var o = {valueOf:function(){返回4;}};求o + 2;得到6,一个数字,求o + '2'得到'42',一个字符串。
要查看总览表是如何生成的,请访问http://jsfiddle.net/1obxuc7m/
其他回答
看起来JavaScript正在将数组转换为字符串并将它们连接在一起。如果要将元组添加到一起,则必须使用循环或映射函数。
从ES6开始,我们可以使用展开运算符做类似的事情:
[...[1, 2], ...[3, 4]]
给:
[1, 2, 3, 4]
它也适用于命名变量:
const a = [1, 2];
const b = [3, 4];
const array = [...a, ...b];
给出相同的结果。
+连接字符串,因此它将数组转换为字符串。
[1,2] + [3,4]
'1,2' + '3,4'
1,23,4
要组合数组,使用concat。
[1,2].concat([3,4])
[1,2,3,4]
如果你可以在JavaScript中重载操作符,那就太好了,但你不能: 我可以在Javascript定义自定义操作符重载吗? 你只能破解“==”操作符,它在比较之前转换为字符串: http://blogger.xs4all.nl/peterned/archive/2009/04/01/462517.aspx
它像添加字符串一样添加两个数组。
第一个数组的字符串表示形式是“1,2”,第二个数组是“3,4”。因此,当找到+号时,它不能对数组求和,然后将它们作为字符串连接起来。