我想将一个数组的元素添加到另一个数组中,所以我尝试了一下:
[1,2] + [3,4]
它回应:
"1,23,4"
到底是怎么回事?
我想将一个数组的元素添加到另一个数组中,所以我尝试了一下:
[1,2] + [3,4]
它回应:
"1,23,4"
到底是怎么回事?
如果您可以在JavaScript中重载运算符,但不能这样做,那就太好了: 我可以在Javascript中定义自定义运算符重载吗? 您只能在比较之前修改“ ==”运算符并将其转换为字符串:http : //blogger.xs4all.nl/peterned/archive/2009/04/01/462517.aspx
它确实在执行您要求的操作。
您要添加的是数组引用(JS将其转换为字符串),而不是数字。有点像将字符串加在一起:"hello " + "world"
="hello world"
看来JavaScript会将数组转换成字符串并将其连接在一起。如果要一起添加元组,则必须使用循环或map函数。
[1,2]+[3,4]
在JavaScript中与评估相同:
new Array( [1,2] ).toString() + new Array( [3,4] ).toString();
因此,要解决您的问题,最好的办法是就地添加两个数组,或者不创建新数组:
var a=[1,2];
var b=[3,4];
a.push.apply(a, b);
在JavaScript中,二进制加法运算符(+
)同时执行数字加法和字符串连接。但是,当它的第一个参数既不是数字也不是字符串时,则将其转换为字符串(因此为“ 1,2
”),然后对第二个“ 3,4
” 进行相同的操作,并将它们连接为“ 1,23,4
”。
尝试改用Arrays的“ concat”方法:
var a = [1, 2];
var b = [3, 4];
a.concat(b) ; // => [1, 2, 3, 4];
它将两个数组当作字符串添加。
第一个数组的字符串表示形式为“ 1,2”,第二个数组的字符串表示形式为“ 3,4”。因此,当+
找到符号时,它不能对数组求和,然后将它们串联为字符串。
JavaScript的+
运算符有两个目的:加两个数字或连接两个字符串。它没有针对数组的特定行为,因此它将数组转换为字符串,然后将其连接。
如果你想加入两个数组,以产生一个新的,使用的.concat
方法代替:
[1, 2].concat([3, 4]) // [1, 2, 3, 4]
如果要有效地将一个数组中的所有元素添加到另一个数组中,则需要使用.push方法:
var data = [1, 2];
// ES6+:
data.push(...[3, 4]);
// or legacy:
Array.prototype.push.apply(data, [3, 4]);
// data is now [1, 2, 3, 4]
+
操作员的行为在ECMA-262 5e第11.6.1节中定义:
11.6.1加法运算符(+)
加法运算符执行字符串连接或数字加法。生产
AdditiveExpression : AdditiveExpression + MultiplicativeExpression
评估如下:
- 我们
lref
要评估的结果AdditiveExpression
。- 我们
lval
是GetValue(lref)
。- 我们
rref
要评估的结果MultiplicativeExpression
。- 我们
rval
是GetValue(rref)
。- 我们
lprim
是ToPrimitive(lval)
。- 我们
rprim
是ToPrimitive(rval)
。- 如果
Type(lprim)
是String
或者Type(rprim)
是String
,则
- 返回
ToString(lprim)
由连接后跟的字符串ToString(rprim)
- 返回应用加法运算的结果
ToNumber(lprim)
和ToNumber(rprim)
。请参见下面的注释11.6.3。
您可以看到每个操作数都已转换ToPrimitive
。通过进一步阅读,我们可以发现ToPrimitive
它将始终将数组转换为字符串,从而产生此结果。
它将单个数组转换为字符串,然后组合字符串。
这是因为,+运算符假定操作数不是数字,而是字符串。因此,它首先将它们转换为字符串和concats,以给出最终结果(如果不是数字)。另外,它不支持数组。