==的隐式转换

前言

==在js中用到的很多,大家都知道两个等于号只判断值,===值和类型都会判断,接下来我们就来看看==是如何判断的

探究==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
     对象
\
字符串 布尔值
\ /
数值


1. 对象和布尔值比较
对象和布尔值进行比较时,对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字
[] == true; //false []转换为字符串'',然后转换为数字0,true转换为数字1,所以为false

2. 对象和字符串比较
对象和字符串进行比较时,对象转换为字符串,然后两者进行比较。
[1,2,3] == '1,2,3' // true [1,2,3]转化为'1,2,3',然后和'1,2,3', so结果为true;

3. 对象和数字比较
对象和数字进行比较时,对象先转换为字符串,然后转换为数字,再和数字进行比较。
[1] == 1; // true `对象先转换为字符串再转换为数字,二者再比较 [1] => '1' => 1 所以结果为true

4. 字符串和数字比较
字符串和数字进行比较时,字符串转换成数字,二者再比较。
'1' == 1 // true

5. 字符串和布尔值比较
字符串和布尔值进行比较时,二者全部转换成数值再比较。
'1' == true; // true

6. 布尔值和数字比较
布尔值和数字进行比较时,布尔转换为数字,二者比较。
true == 1 // true

7. other
来看一个有趣的题
[] == false;
![] == false;
还有一些需要记住的,像:
undefined == null //true undefined和null 比较返回true,二者和其他值比较返回false
Number(null) //0

特殊等式

NaN 和 -0 在相等比较时的表现有些特别。由于NaN和自身不相等,所以必须使用ES6中的Number.isNaN(..) (或者polyfill)。而- 0 等于 0 (对于===也是如此),因此我们必须使用isNegZero(..)这样的工具函数。

ES6 中新加入一个方法Object.is(..)来判断两个值是否绝对相等,可以用来处理上述所有特殊情况:

1
2
3
4
5
6

var a = 2 / "hello";
var b = -3 * 0;
Object.is(a,NaN); //true
Object.is(b,-0); //true
Object.is(b,0); //false

小结

能使用 == 或 === 就尽量不要使用Object.is(..),因为前者效率更高,更为通用。Object.is(..)主要用来处理那些特殊的相等比较。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2018 - 2020 阿母工业前端组 All Rights Reserved.

UV : | PV :