JavaScript中为什么`{} + [] === 0`?深入剖析这个奇怪的相等式

6 min read

这是因为{}[]都是对象,而在JavaScript中,对象在进行运算时会先尝试将它们转换为原始类型,然后再进行运算。当我们将空对象{}和空数组[]+运算符结合时,它们会被分别转换为由字符串"[object Object]"和空字符串组成的字符串,然后再与+运算符组合形成一个新的字符串"[object Object]"

当我们将该字符串和空数组[]再用=====运算符相等比较时,它们都会被转换为数字类型,而由于该字符串不是一个有效的数字格式,因此它会被转换为NaN,而空数组[]会被转换为数字0。由于任何数值与NaN的相等比较结果都是false,因此该比较结果为false

当我们在字符串前加上一个正号+作为一元运算符时,它会将这个字符串尝试转换为数值类型,由于该字符串不是一个有效的数字格式,因此它会被转换为NaN。当我们将NaN和空数组[]再用+运算符相加时,由于NaN是非数字类型,因此+运算符会将它转换为为 NaN,然后让空数组[]转换为了字符串'',最后把''NaN相加得到字符串'NaN'

如果我们将字符串'NaN'再尝试转换为数字类型,它会转换为NaN。由于任何数值与NaN的相等比较结果都是false,因此该比较结果为false

因此,{} + [] === 0的结果为false