JS 在进行比较时的隐式转换

134 阅读2分钟

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 都将被忽略,而数组转换成数字可以看成是基于转换成的字符串再转换为数值。