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

为什么javascript在添加对象时会将对象更改为其他内容?,javascript,Javascript,有人向我指出了在javascript中添加空数组的一些有趣之处,我不知道为什么它会这样工作 添加空数组会产生一个字符串 换句话说,[]+[]返回“ 我启动了我的控制台来测试它,果然,它工作了。我进一步发现,这种行为不仅限于空数组。数字、字符串、数组和对象的数组在添加到任何其他数组时都会变成字符串。例如: [1] + [] //returns "1" [1] + [2] //returns "12" [1,2,3] + [2] //returns "1,2,32" [{foo:'bar'},'fo

有人向我指出了在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"
当添加到其他对象时,它也会出现在其他对象中,但仅当对象位于右侧时才会出现。如果位于左侧,则对象将变为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
除非我将对象指定给变量,否则会发生这种情况。如果我使用
X={foo:'bar}

X + 'foo' //returns "[object Object]foo"
然后这个物体又变成了一个字符串


我可以理解为什么在
=
操作符中会发生这种类型的转换,但是为什么加法会这样做呢?为什么加法会将数组和对象(是的,我知道数组也是对象)变成其他东西?

这叫做类型强制,这就是JavaScript的编写方式。我建议您阅读以下内容,以获得清晰的图像:


因此,应避免使用非类型安全的等式运算符,即
==
=。你应该使用
==
==和强制类型转换(
parseInt()
等)。

该运算符仅用于添加数字或连接字符串,如果与其他类型一起使用,它们将转换为数字或字符串,具体取决于大小写(该部分实际上有点复杂…)

从:

加法运算符执行字符串串联或数字加法

至于为什么语言是这样设计的,我们只能猜测,但Shadow爬行者在他的回答中给出了一个似是而非的理由:它在每种不同类型上的行为都有多种可能,因此可能会令人困惑。

试图执行([1,2,3]+[1,2,3])是不明确的。是否应导致[1,2,3,1,2,3]或[2,4,6]或字符串值“[1,2,3][1,2,3]”


Javascript试图以它认为有意义的方式转换内容。有关这一点的解释,请参见

b,因为JavaScript就是这样做的。这就是打字的意义(松散还是脆弱?)。你的家庭作业或工作有什么实际问题吗?这不是一个真正的讨论论坛。我同意“JavaScript就是这样做的”。然而,这绝对不是松散类型,这只是JavaScript固有的怪癖:)关于语言行为的“为什么”问题超出了本网站的范围。也许语言开发人员可以洞察他们的思维方式,但我们这些凡人必须认识到并解释这种行为。JavaScript类型强制可以产生很多不直观的结果,我最近对此了解了很多:实际上,它被称为类型强制,而不是松散的类型强制。再往下看一看你链接的页面。谢谢你,编辑了我的答案。+1关于
+
为什么要这样做的问题的简短回答很好。