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