[]+{}以及{}+[]的返回结果的问题

[] + {};// "[object Object]"
{} + [];// 0

首先还是不太理解为什么会返回这样的结果,其次就是想知道两个对象相加时,强制类型的转换遵循什么样的规则?
望大神求解!谢谢!

阅读 1.6k
3 个回答

JS中{}+[][]+{}的返回值情况是怎样的?

先说 [] + {}
一个数组加一个对象。加法会进行隐式类型转换,规则是调用其 valueOf()toString() 以取得一个非对象的值(primitive value)。如果两个值中的任何一个是字符串,则进行字符串串接,否则进行数字加法。
[]{}valueOf() 都返回对象自身,所以都会调用 toString(),最后的结果是字符串串接。[].toString() 返回空字符串,({}).toString() 返回"[object Object]"。最后的结果就是"[object Object]"

然后说 {} + []
看上去应该和上面一样。但是 {} 除了表示一个对象之外,也可以表示一个空的 block。在 [] + {} 中,[] 被解析为数组,因此后续的 + 被解析为加法运算符,而 {} 就解析为对象。但在 {} + [] 中,{} 被解析为空的 block,随后的 + 被解析为正号运算符。即实际上成了:{ // empty block } + [] 即对一个空数组执行正号运算,实际上就是把数组转型为数字。首先调用 [].valueOf() 。返回数组自身,不是 primitive value,因此继续调用 [].toString() ,返回空字符串。空字符串转型为数字,返回 0,即最后的结果。

楼上讲的很详细了,我再给你补充点。。。

比如:1 + [] = 1 + String([]) = 1 + "" = "1"

比如:1 + {} = 1 + String({}) = 1 + "[object Object]" = "1[object Object]";

比如:{} + {} = { /这里作为代码块解析/ } + {} = + {} = Number(String({})) = Number("[object Object]") = NaN

{} + {}的结果是会因浏览器而有不同结果,Chrome(v55)中是object Object字符串连接,但其它的浏览器则是认为相当于+{}运算,得出NaN数字类型。

{} + []的结果是相当于+[],结果是0数字类型。

详细看看这篇文章https://segmentfault.com/a/11...

推荐问题
宣传栏