当两个不同类型的数据进行抽象比较(==)时,JS会将它们先转换成统一数据类型,低层级的数据类型向高层级的数据类型转换,直到“==”左右两边数据类型相同,然后比较数据的值是否相同。
举个例子:
- 数字遇上字符串:字符串→数字
1 == '1' //true
- 数字遇上布尔:布尔→数字
0 == false //true
- 数字遇上对象:对象→数字
0 == [0] //true
- 字符串遇上布尔:字符串→数字,布尔→数字
"" === false //true
"0" === false //true "0" → 0,false → 0
- 字符串遇上对象:对象→字符串
[1, 2, 3] == '1,2,3' //true
- 布尔遇上对象:
[0] == false //true [0] → "0" → 0, false → 0
[] == false //true [] → "0" → 0, false → 0
![] == false //true
![] == false //false
undefined == false //false
null == false //false
undefined == null //true
注意:
- ![] == false为true是因为 ! 会将 [] 直接转换成Boolean,在JS中,将其他数据类型转换成Boolean时,只有空字符串("")、0、null、undefined、NaN会转换成false,其他数据都会转换成true,所以空数组([])会被转换成true,![]为false,!![]为true
- undefined和null与任何有意义的值比较返回的都是false,但是null与undefined之间互相比较返回的是true。