可能你們平時大多使用(===),儘可能避免了(==),可是在進行(>)和(<)的時候也會發生(==)一樣的隱式轉換,因此這個知識點是必須掌握的。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
複製代碼