可能你们平时大多使用(===),尽可能避免了(==),可是在进行(>)和(<)的时候也会发生(==)一样的隐式转换,因此这个知识点是必须掌握的。javascript
左值(x) | 右值(y) | 隐式处理 |
---|---|---|
Number | String | ToNumber(y) |
String | Number | ToNumber(x) |
Boolean | others | ToNumber(x) |
others | Boolean | ToNumber(y) |
Object | !Object | Toprimitive(x) |
!Object | Object | Toprimitive(y) |
注意:此处的others表示其它基础类型java
先返回valueOf()的值,若返回的不是基础类型的值,bash
则返回toString()的值,若返回的不是基础类型的值,ui
则抛出异常。spa
null和undefined单独出现与其余值进行比较不进行转换。code
isNaN(Number(undefined)) //true
Number(null)===0 //true
Number("[空值或空值的组合]")===0 //true
复制代码
掌握以上知识点其实已经彻底掌握在”==“的情况下的隐式转换了。ip
首先,要纠正一下思惟,(==)指能够进行强制类型转换的等于比较,隐式转换只是在双方属于不一样类型的时候才会触发,遇到相同类型会直接比较。而且隐式转换具备阶段性,一会咱们立刻就会遇到。string
下面开始分析,看一下下面的例子it
[] == 0; //true
复制代码
看这个例子,它符合左值为”Object“,右值为”Number“的状况,因此进行Toprimitive([]),变为console
"" == 0;
复制代码
此时咱们把这个结果叫作隐式转换的第一阶段结果,由于(==)两边的类型仍是不相同,因此要再次进行隐式转换,如今它符合左值为“String”,右值为“Number的状况”,因此进行ToNumber(“”),根据上面所说的特殊知识点,变为
0 == 0; //true
复制代码
此时为第二阶段的结果,类型相同,进行比较。
下面你能够试着本身分析一下下面的例子
[null] == 0; //true
复制代码
不要着急,让咱们再来一个例子
[] == [null]; //false
复制代码
啊???怎么回事,结果跟咱们想像的好像不同?既然([]==0)和([null]==0),难道根据这两个结果不该该是推导出([]==[null])嘛?缘由在于你没有遵照咱们分析的隐式转换原则,只有不一样类型才会进行隐式转换,可是如今咱们比较的两个值是相同的类型!
可是要注意(<=)和(>=),他在引擎中会被处理成不大于和不小于,如:
a<=b ---> !(a>b)
复制代码
为何要说这点?试着输出下面的例子你就明白了
var a= {b:1};
var b= {b:2};
console.log(a>b); //false
console.log(a==b); //false
console.log(a>=b); //true
复制代码