为什么在JavaScript中\[1,2\] + \[3,4\] =“ 1,23,4”?

JavaScript KoaJS

蛋蛋猿

2020-03-30

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

[1,2] + [3,4]

它回应:

"1,23,4"

到底是怎么回事?

第3830篇《为什么在JavaScript中\[1,2\] + \[3,4\] =“ 1,23,4”?》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

9个回答
乐米亚 2020.03.30

这是因为,+运算符假定操作数不是数字,而是字符串。因此,它首先将它们转换为字符串和concats,以给出最终结果(如果不是数字)。另外,它不支持数组。

Mandy宝儿 2020.03.30

如果您可以在JavaScript中重载运算符,但不能这样做,那就太好了: 我可以在Javascript中定义自定义运算符重载吗? 您只能在比较之前修改“ ==”运算符并将其转换为字符串:http : //blogger.xs4all.nl/peterned/archive/2009/04/01/462517.aspx

阿飞 2020.03.30

它确实在执行您要求的操作。

您要添加的是数组引用(JS将其转换为字符串),而不是数字。有点像将字符串加在一起:"hello " + "world"="hello world"

卡卡西乐 2020.03.30

看来JavaScript会将数组转换成字符串并将其连接在一起。如果要一起添加元组,则必须使用循环或map函数。

蛋蛋 2020.03.30

[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);
猴子村村 2020.03.30

在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];
猴子 2020.03.30

它将两个数组当作字符串添加

第一个数组的字符串表示形式为“ 1,2”,第二个数组的字符串表示形式为“ 3,4”因此,当+找到符号,它不能对数组求和,然后将它们串联为字符串。

老丝 2020.03.30

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评估如下:

  1. 我们lref要评估的结果AdditiveExpression
  2. 我们lvalGetValue(lref)
  3. 我们rref要评估的结果MultiplicativeExpression
  4. 我们rvalGetValue(rref)
  5. 我们lprimToPrimitive(lval)
  6. 我们rprimToPrimitive(rval)
  7. 如果Type(lprim)String或者Type(rprim)String,则
    1. 返回ToString(lprim)连接后跟的字符串ToString(rprim)
  8. 返回应用加法运算的结果ToNumber(lprim)ToNumber(rprim)请参见下面的注释11.6.3。

您可以看到每个操作数都已转换ToPrimitive通过进一步阅读,我们可以发现ToPrimitive它将始终将数组转换为字符串,从而产生此结果。

伽罗理查德 2020.03.30

它将单个数组转换为字符串,然后组合字符串。

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android