JavaScript:数组。为什么将空数组与填充的数组连接会产生字符串?

JavaScript:数组。为什么将空数组与填充的数组连接会产生字符串?,javascript,arrays,concatenation,Javascript,Arrays,Concatenation,我正在研究一个展平阵列的问题。我遇到了一些非常奇怪的事情,似乎在网上找不到答案 为什么 [] + [1,2] = '1,2' 我似乎无法理解为什么将空数组添加到填充数组中会导致包含填充数组内容的字符串 幕后发生了什么导致了这种情况 我的代码中的示例: arr = [1, [2], [3, 4]]; arr.reduce(flatten, []); // [1, 2, 3, 4] function flatten(a, b) { return a.concat(b); } 据我所知,

我正在研究一个展平阵列的问题。我遇到了一些非常奇怪的事情,似乎在网上找不到答案

为什么

[] + [1,2] = '1,2'
我似乎无法理解为什么将空数组添加到填充数组中会导致包含填充数组内容的字符串

幕后发生了什么导致了这种情况

我的代码中的示例:

arr = [1, [2], [3, 4]];
arr.reduce(flatten, []); // [1, 2, 3, 4]

function flatten(a, b) {
    return a.concat(b);
}

据我所知,reduce会将“[]”设置为“初始值”,因此对于原始数组中的每个元素,它会将其与一个空数组连接起来,从而“展平”数组。

这是因为
+
操作符触发了JavaScript。您不能简单地对数组执行
+
操作,因此它们被转换为字符串(其中包含数组的逗号分隔字符串转换值)。

使用+将生成一个字符串,并且控制台不包括括号。同

''+[1,2]

在对象(数组是对象)之间使用
+
时,JavaScript在内部调用
toString()
和/或
valueOf()

var强制1={}+{foo:'foo',bar:'bar'},
强制2=[]+['foo','bar'];
console.log(强制1);

console.log(强制2)
JavaScript不是Python,+运算符不连接列表。数组被强制为字符串。尝试
[1,2].toString()
+
是算术加法和字符串串联运算符。因此,数组会自动转换为字符串,以匹配运算符的参数类型。检查数组连接。排除括号的不是控制台。可能没有正确表达,但这就是发生的情况。如果你做了{uno:11,dos:22}+''括号被添加。视觉语言,不。这将提供默认的
[object object]
。我们讨论的是数组,而不是POJO,它们将字符串化为逗号分隔的值。如果需要方括号,请使用
JSON.stringify
而不是字符串强制。对[object object]执行.length,方括号将被计数,尽管它只是转换为字符串的对象的可视表示形式。再次,数组有一个自定义的
toString
实现,它们不会产生与对象相同的字符串。事实上,可以用它来测试对象是否是数组:
object.prototype.toString.call([1,2])==='[object array]'
,但是
[1,2].toString()====='1,2'