这是因为{}
和[]
都是对象,而在JavaScript中,对象在进行运算时会先尝试将它们转换为原始类型,然后再进行运算。当我们将空对象{}
和空数组[]
与+
运算符结合时,它们会被分别转换为由字符串"[object Object]"
和空字符串组成的字符串,然后再与+
运算符组合形成一个新的字符串"[object Object]"
。
当我们将该字符串和空数组[]
再用==
或===
运算符相等比较时,它们都会被转换为数字类型,而由于该字符串不是一个有效的数字格式,因此它会被转换为NaN
,而空数组[]
会被转换为数字0
。由于任何数值与NaN
的相等比较结果都是false
,因此该比较结果为false
。
当我们在字符串前加上一个正号+
作为一元运算符时,它会将这个字符串尝试转换为数值类型,由于该字符串不是一个有效的数字格式,因此它会被转换为NaN
。当我们将NaN
和空数组[]
再用+
运算符相加时,由于NaN
是非数字类型,因此+
运算符会将它转换为为 NaN
,然后让空数组[]
转换为了字符串''
,最后把''
和NaN
相加得到字符串'NaN'
。
如果我们将字符串'NaN'
再尝试转换为数字类型,它会转换为NaN
。由于任何数值与NaN
的相等比较结果都是false
,因此该比较结果为false
。
因此,{} + [] === 0
的结果为false
。