为啥javascript在添加时会将对象更改为其他内容? [关闭]

Posted

技术标签:

【中文标题】为啥javascript在添加时会将对象更改为其他内容? [关闭]【英文标题】:Why does javascript change objects into other things when added? [closed]为什么javascript在添加时会将对象更改为其他内容? [关闭] 【发布时间】:2013-04-17 22:16:06 【问题描述】:

有人向我指出了有关在 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 所做的。这就是(松散还是弱?)打字。 您的家庭作业或工作是否有实际问题?这不是一个真正的论坛。 我同意“这就是 JavaScript”的作用。然而,这绝对不是松散类型,它只是 JavaScript 固有的怪癖:) “为什么”关于语言行为的问题超出了本网站的范围。也许语言开发人员可以提供对他们思维方式的洞察,但我们这些凡人必须简单地认识并解释这种行为。 JavaScript 类型强制可以做很多事情来产生不直观的结果,我最近学到了很多这方面的知识:***.com/questions/15978204/… 【参考方案1】:

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

来自language specification:

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

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

【讨论】:

+1 关于为什么+ 做它的问题的简短回答。【参考方案2】:

这称为类型强制,这就是 JavaScript 的编写方式。我建议您阅读以下内容,以获得清晰的图片:http://blog.jeremymartin.name/2008/03/understanding-loose-typing-in.html

因此,您应避免使用非类型安全的等式运算符,即==!=。您应尽可能使用===!== 并强制进行类型转换(parseInt() 等)。

【讨论】:

其实叫Type Coercion,不是松散的打字。再往下看你链接的页面。 谢谢,编辑了我的答案。【参考方案3】:

尝试执行 ( [1,2,3] + [1,2,3] ) 是模棱两可的。它应该导致 [1,2,3,1,2,3] 还是 [2,4,6] 或字符串值“[1,2,3][1,2,3]”?

Javascript 尝试以它认为有意义的方式转换事物。有关该问题的一些解释,请参阅http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/

【讨论】:

以上是关于为啥javascript在添加时会将对象更改为其他内容? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

html 此JavaScript将更改指向页面上SharePoint徽标的链接。默认链接转到站点主页,这会将其更改为whateve

将地图添加到列表会将列表中的所有地图更改为最新地图的值

将Window Object上的Mouse Wheel事件更改为{passive:false} - Javascript

为啥我总是必须将精灵的位置更改为其他位置才能获得所需的位置

为啥 Android Studio 不断切换“语言级别”?

为啥将张量对象更改为 tf.constant 有效