js中的==与===

2,079 阅读2分钟

我们都知道js中判断两个数是否相等有两个操作符=======是不严格相等,在比较过程中会先将比较数进行强制类型转化,在进行值比较,而===是严格相等,它不会对数值的类型进行强制转换,所以理解为===会对数进行双重校验,先比较类型,再比较值。如果两个数的类型都不相等,那么这两个数肯定就不相等啦~

对于===这种严格相等比较的话大家基本上不会有什么异议,但是==真的是傻傻分不清啊!!!

现在整理一份便于比较的小tips,请查收~

首先js中有个比较特殊的数---NAN,这个数与任意数相比较都为false,hhhh,甚至与自身做比较时也是false

NaN == "0"  //false
NaN == null  //false
NaN == undefined  //false
NaN == []  //false
NaN == {}  //false
NaN == 0  //false
NaN == false  //false

哈哈哈哈,感觉是不是还挺省事,就special,那我们怎么判断一个值是否为NaN呢,一般通过isNaN()函数判断的

js中还有两个特殊的数,null和undefined。这两个值互相等且自身等,其余情况与谁相比都不相等。

null == null  //true
null == undefined  //true
undefined == null  //true 
undefined == undefined  //true

其余的类型都是会隐式转化成对应的值来做比较的,比较规则如下表:

被比较数B
Number String Boolean Object
比较数A Number A === B A === ToNumber( B ) A === ToNumber( B ) A == ToPrimitive( B )
String ToNumber( A ) === B ToNumber( A ) === ToNumber( B ) ToNumber( A ) === ToNumber( B ) ToPrimitive( B ) == A
Boolean ToNumber( A ) === B ToNumber( A ) === ToNumber( B ) ToNumber( A ) === ToNumber( B ) ToNumber( A ) == ToPrimitive( B )
Object ToPrimitive( A ) == B ToPrimitive( A ) == B ToPrimitive( A ) == ToPrimitive( B ) A === B

在上面的表格中,ToNumber(A) 尝试在比较前将参数 A 转换为数字。ToPrimitive(A)通过尝试调用 A 的A.toString() 和 A.valueOf() 方法,将参数 A 转换为原始值(Primitive)。

==============
最近又发现剩下的比较的时候有个更简单的方法: 比较简单类型的时候可以比较值,比较复杂类型的时候可以比较地址