JS 中不同的数据类型之间的比较转换规则
1.对象和布尔值比较
对象和布尔值进行比较时,对象先转换为字符串,然后在转换为数字,布尔值直接转换为数字
[] == true;
// false
// [] 转换为 '',然后再转换为数字0,true 转换为数字 1,所以为 false
2.对象和字符串比较
对象转换为字符串,然后两者再进行比较
[1, 2, 3] == '1,2,3';
// true
// 数组 [1, 2, 3] 转化为 '1,2,3',然后再和 '1,2,3' 进行比较,结果为 true
3.对象和数字比较
对象和数字进行比较时,对象先转换为字符串,然后再转换为数字,再和数字比较
[1] == 1;
// true
4.字符串和数字比较
字符串和数字进行比较时,字符串转换成数字再比较
'1' == 1;
// true
5.字符串和布尔值比较
字符串和布尔值进行比较时,二者全部转换成数值再比较
'1' == true;
// true
'2' == true;
// false
6.布尔值和数字比较
布尔值和数字进行比较时,布尔转换为数字,二者比较
true == 1;
// true
如上图,任意两种类型比较的时候,如果不是同一个类型比较的话,则按照如图方式进行相应类型转换,如果对象和布尔比较的话:对象->字符串->数值 布尔值->数值
有趣的题目:
[] == false;
![] == false;
// 都是 true
// 第一个:对象->字符串->数值 得 0 false->数值 也是 0
// 第二个:前面有个 ! ,则直接转换为布尔值再取反
// (转换为布尔值时除了 ''/NaN/0/null/undefined ,返回的都是 true) 所以 ![] 为 false,结果为true
undefined 与 null 得类型转换
undefined == null;
// true;
// undefined 和 null 比较时返回 true,这两个和其他值比较返回 false
Number(null) // 0
- 强制转换为布尔类型时两者都是 false
- 强制转换为数值,undefined 返回的是 NaN,null返回的是0。用 isNaN() 验证,undefined 不是数字,null 是数字。
- 特别的: undefined == null 结果为 true
- 比较操作符 == 不会自动转换 undefined 和 null
null 参与数字计算时可以自动转换为 0,undefined 只能转换为 NaN。数组转换成字符串时,作为数组元素的 undefined 和 null 都将被忽略,而数组转换成数字可以看成是基于转换成的字符串再转换为数值。