不容錯過的雙等(==)小知識

== 表明相同, ===表明嚴格相同,javascript

進一步解釋: 當進行雙等號比較時候: 先檢查兩個操做數數據類型,若是相同, 則進行===比較, 若是不一樣, 則進行一次類型轉換, 轉換成相同類型後再進行比較, 而===比較時, 若是類型不一樣,直接返回false.前端

根據具體須要,JavaScript 按照以下規則將變量轉換成布爾類型:java

  1. false0、空字符串("")、NaNnullundefined 被轉換爲 false
  2. 全部其餘值被轉換爲 true

上述兩段話你們應該都知道,被問到也都能答上來。函數

問:1 == true 返回什麼?post

答:trueui

問:2 == true 返回什麼?spa

答:falsecode

你的腦子裏可能會想, 2轉成boolean不是true麼?可是,實際上,當booleannumber作雙等判斷時,是將true轉成1再與數字作比較cdn

若是你不知道這個,那就浪費5分鐘看一下下文吧~對象

三等===:

  1. 若是類型不一樣,就必定不相等
  2. 若是兩個都是數值,而且是同一個值,那麼相等;若是其中至少一個是NaN,那麼不相等。(判斷一個值是不是NaN,只能使用isNaN( ) 來判斷)
  3. 若是兩個都是字符串,每一個位置的字符都同樣,那麼相等,不然不相等。
  4. 若是兩個值都是true,或是false,那麼相等
  5. 若是兩個值都引用同一個對象或是函數,那麼相等,不然不相等
  6. 若是兩個值都是null,或是undefined,那麼相等

記筆記:

NaN === NaN // false

+0 === -0 // true

等式 (x !== x) 成立的惟一狀況是 x 的值爲 NaN)

雙等==:

  1. 優先對比數據的類型是否一致
  2. 若是兩個值類型相同,則進行三等(===)比較
  3. 不一致則**進行隱式轉換,**而後進行三等(===)比較

在比較前將兩個被比較的值轉換爲相同類型。在轉換後(等式的一邊或兩邊均可能被轉換)

若是沒法轉成同類型就報錯

ECMAS實現雙等的抽象比較的邏輯以下:

x == y

  1. x 與 y 類型相同

    a. Type(x) 爲 undefined,返回true

    b. Type(x) 爲 null,返回true

    c. Type(x) 爲 number,則

    i. x 爲NaN,返回false 
    
    ii. y 爲NaN,返回false 
    
    iii. x 與 y的值相等,返回 true
    
    iv. x = +0, y = - 0, 返回true
    
    v. 返回 false
    複製代碼

    d. 若是 Type(x) 爲 string, y 爲與 x 一致的字符串,返回 true, 不然返回 false

    e. Type(x) 爲 number,判斷是否都是true或者false

    f. Type(x) 爲對象, x 和 y 指向同一對象時返回true,不然返回 false

  2. x 爲 null,y 爲 undefined, 返回 true

  3. x 爲 undefined,y 爲 null, 返回 true

  4. 數字 == 字符串,string 轉成number

  5. boolean == any, boolean 轉成 number, 而後從新進行雙等比較

  6. 字符串 == 對象 或 數字 == 對象, 調用 ToPrimitive(object) 轉成 string 或 number

  7. 返回 false

ToPrimitive(A)經過嘗試調用 A 的A.toString()A.valueOf() 方法,將參數 A 轉換爲原始值(Primitive)。

ToNumber(A) 嘗試在比較前將參數 A 轉換爲數字,這與 +A(單目運算符+)的效果相同。

上圖說話,按從上到下的邏輯執行:

相等操做符對於不一樣類型的值,進行的比較以下圖所示:

被比較值 B
Undefined Null Number String Boolean Object
被比較值 A Undefined true true false false false IsFalsy(B)
Null true true false false false IsFalsy(B)
Number false false A === B A === ToNumber(B) A=== ToNumber(B) A== ToPrimitive(B)
String false false ToNumber(A) === B A === B ToNumber(A) === ToNumber(B) ToPrimitive(B) == A
Boolean false false ToNumber(A) === B ToNumber(A) === ToNumber(B) A === B ToNumber(A) == ToPrimitive(B)
Object false false ToPrimitive(A) == B ToPrimitive(A) == B ToPrimitive(A) == ToNumber(B) A === B

例子

var num = 0;
var obj = new String("0");
var str = "0";
var b = false;

console.log(num == num); // true
console.log(obj == obj); // true
console.log(str == str); // true

console.log(num == obj); // true
console.log(num == str); // true
console.log(obj == str); // true
console.log(null == undefined); // true

// both false, except in rare cases
console.log(obj == null);
console.log(obj == undefined);
複製代碼

有些開發者認爲,最好永遠都不要使用相等操做符。全等操做符的結果更容易預測,而且由於沒有隱式轉換,全等比較的操做會更快。

小知識:Object.is(a,b)判斷a與b是否徹底相等,與===基本相同,不一樣點在於Object.is判斷+0不等於-0NaN等於自身

若是你收穫了新的知識,請給做者點個贊吧~

相關係列: 從零開始的前端築基之旅(超級精細,持續更新~)

參考文檔

JavaScript 中的相等性判斷

相關文章
相關標籤/搜索