-1

有人向我指出了在 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"

物体又变回了字符串。

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

4

3 回答 3

5

该运算符仅用于添加数字或连接字符串,如果您将其与其他类型一起使用,它们将根据情况转换为数字或字符串(这部分实际上有点复杂......)。

语言规范

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

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

于 2013-04-17T22:22:09.097 回答
1

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

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

于 2013-04-17T22:20:32.447 回答
1

尝试执行( [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/

于 2013-04-17T22:23:57.310 回答