为什么javascript在添加时会将对象更改为其他内容?

cke*_*sch -1 javascript

有人指出在javascript中添加空数组有趣,我不知道为什么它的工作方式如此.

添加空数组会产生一个字符串.

换句话说,[] + []回报""

我启动了我的控制台来测试它,果然,它确实有效.我进一步发现这种行为不仅限于空数组.数字,字符串,数组和对象的数组在添加到任何其他数组时都会变成字符串.一些例子是:

[1] + [] //returns "1"
[1] + [2] //returns "12"
[1,2,3] + [2] //returns "1,2,32"
[{foo:'bar'},'foo','bar'] + [] //returns "[object Object],foo,bar"
Run Code Online (Sandbox Code Playgroud)

当添加到其他任何对象时,它也会与其他对象一起出现,但仅当对象位于右侧时才会出现.如果它在左侧,则对象变为0.

'foo' + {foo:'bar'} //returns "foo[object Object]"
1 + {foo:'bar'} //returns "1[object Object]"
{foo:'bar'} + 1 //returns 1
{foo:'bar'} + 'foo' //returns NaN
Run Code Online (Sandbox Code Playgroud)

除非我将对象分配给变量,否则会发生这种情况.如果我用X = {foo:'bar'},

X + 'foo' //returns "[object Object]foo"
Run Code Online (Sandbox Code Playgroud)

然后对象又变成了一个字符串.

我可以理解为什么这种类型的转换可能会在==运算符中发生,但为什么要添加呢?为什么添加更改数组和对象(是的,我知道数组也是对象)到其他东西?

bfa*_*tto 5

该运算符仅用于添加数字或串联字符串,如果您将其与其他类型一起使用,它们将被转换为数字或字符串,具体取决于具体情况(该部分实际上有点复杂......).

语言规范:

加法运算符执行字符串连接或数字加法.

至于为什么语言是这样设计的,我们只能猜测,但是Shadow Creeper在他的回答中显示了一个似是而非的理由:在每种不同的类型上它的行为会有几种可能性,所以它可能会令人困惑.