強制類型轉換之(==)

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

Toprimitive(Object)

​ 先返回valueOf()的值,若返回的不是基礎類型的值,bash

​ 則返回toString()的值,若返回的不是基礎類型的值,ui

​ 則拋出異常。spa

比較特殊的知識點

null和undefined單獨出現與其餘值進行比較不進行轉換。code

isNaN(Number(undefined))  //true
Number(null)===0  //true
Number("[空值或空值的組合]")===0  //true
複製代碼
什麼是空值?
  1. null
  2. (啥都沒有)
  3. (Space空格)
  4. (空格的轉義)
  5. (Tab縮進)
  6. \r
  7. \n
  8. \f
  9. \t
  10. 可能還有,我只知道這麼多了

掌握以上知識點其實已經徹底掌握在」==「的情況下的隱式轉換了。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
複製代碼
相關文章
相關標籤/搜索