向我指出了在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"
然后对象又变成了一个字符串。
我能理解为什么这种类型的转换可能发生在==
运算符中,但为什么要添加呢?为什么添加更改数组和对象(是的,我知道数组也是对象)到其他东西?
答案 0 :(得分:5)
该运算符仅用于添加数字或连接字符串,如果将其与其他类型一起使用,它们将被转换为数字或字符串,具体取决于具体情况(该部分实际上有点复杂......)。
加法运算符可以执行字符串连接或数字加法。
至于为什么语言是这样设计的,我们只能猜测,但Shadow Creeper在他的回答中显示了一个似是而非的理由:它在每种不同类型上都有几种可能性,所以这可能令人困惑。
答案 1 :(得分:1)
这称为类型强制,这就是JavaScript的编写方式。我建议您阅读以下内容,以获得清晰的图片:http://blog.jeremymartin.name/2008/03/understanding-loose-typing-in.html
因此,您应避免使用非类型安全的等式运算符,即==
和!=
。您应尽可能使用===
和!==
并强制进行类型转换(parseInt()
等)。
答案 2 :(得分: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/