我们都知道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)。
==============
最近又发现剩下的比较的时候有个更简单的方法:
比较简单类型的时候可以比较值,比较复杂类型的时候可以比较地址