console.log([] + {})

解题思路
这里涉及到 '+'号的运算原理
当两侧都是数字的时候 相加 1 + 1 = 2
当一侧是数字,一侧是字符串 字符串拼接数字 1 + ‘1’ = ‘11’(如果是-号的话会将字符串转换为数字进行减法操作 * / % > < == 也是如此)
两侧都是字符串 拼接字符串 ‘1’ + ‘1’ = ‘11’
上面这些都是原始数据类型的+法操作,下面是复杂数据类型的+法操作
当+号一侧数据类型是对象时,会将对象先进行valueOf操作,如果返回原始数据类型则,按照上面原始数据类型计算,如果返回的值还是对象则再调用toString方法,返回原始数据类型则按照上面原始数据类型计算,否则报错

上面 [] 和 {}都是复杂数据类型,所以在进行 + 操作时先调用它们的valueOf方法,返回的还是它们自身,然后调用toString方法,[]调用toString方法变成’'空字符串,{}.toString() 等于[object object] 这时两侧都是字符串类型,所以对其进行拼接操作 结果就是​​[object object]​

还有几点需要注意的
当 + 号两侧是数字类型和NaN,则结果就是NaN
一般+号遇到对象类型数据 就是将其toString,然后当做字符串操作,比如
NaN + [] => ‘NaN’
NaN虽然叫做不是一个数字,可数据类型确是number类型;NaN和任何number类型数据+ - * /% …操作结果都是 NaN
[]转换成原始数据类型结果是 ''空字符串
NaN + [] => 原始数据类型 + 复杂数据类型 => NaN + ‘’ => ‘NaN’
{}转换成原始数据类型结果是 字符串[object object]

最后如果本文对你有用的话欢迎你关注我的公众号,会有各种技术栈的文章

空数组+空对象等于什么?数据类型转换问题_字符串