本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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]