JS中「==」和「===」的原理和區別

一、爲何討論這個問題?javascript

     - 有個說法,儘可能不用==,而使用===,是這樣嗎?html

二、分析問題,原理是什麼?java

  下面說說ECMAScript 5 language specification裏的說明:spa

  1)兩種比較方法htm

    全等號===只考慮類型相同的值的比較,不一樣類型使用===進行比較,返回false對象

    雙等號==會先將不一樣類型的值轉爲相同類型,而後使用全等號進行比較。ip

    使用雙等號會有兩個問題:ci

    ● 轉換規則可能不是你指望的那樣string

    ● 因爲雙等號是寬容的,類型錯誤可能會被忽略掉。it

  2)全等號===(嚴格等號)

    比較兩個值,

    若是類型不一樣,必定返回false;

    若是類型相同,則按照以下的規則進行比較:

      ① 兩個都是undefined類型,返回true;(undefined === undefined)

      ② 兩個都是null類型,返回true;(null === null)

      ③ 兩個都是number類型

        若是有一個是NaN,則爲false;(Nan !== *//any value including NaN)

        若是兩個值相同,返回true;(x==x)

        一個是+0,一個是-0(+0===-0)

      ④ 兩個都是boolean類型或者兩個都是string類型(基礎數據類型,不是String對象),答案很明顯。

        "111" === "111"//true

        true === true//true

      ⑤ 兩個對象(包括array和function),除非是同一個對象(即同一個引用),不然都是false

        var a = NaN;

        a === a;//false(NaN沒法用來比較)

        

        var b = {}, c = {};

        b === c;//false

        b === b;//true

 

        "abc" = new String("abc");//false(左邊是基本數據類型string,後邊是object類型)

        注:ECMAScript中有5種基本數據類型(Undefined、Null、Boolean、Number、String)

          還有1種複雜數據類型Object。

  3)雙等號==

     比較兩個值,若是兩個值類型相同,則使用===進行對比;

     若是兩個值類型不一樣,則按照一下規則進行比較:

      ① undefined == null

      ② 一個number,一個string,將string轉換成number類型再作比較;

      ③ 一個boolean,一個非boolean,將boolean轉換成number類型再作比較;

      ④ 一個string或者number,跟一個object,將object轉換成基本數據類型再作比較;

     第三條規則會致使大於1的number值不等於true,好比:

      0 == false//true

      1 == true//true

      2 == true//false(true -- > 1 ; 2 != 1)

      2 ? true : false//true

        "" == 0;//true

      "123" == 123;//true

      "" == false//true(false-->0;""-->0;0==0)

      "1" == true//true

      "2" == true//false(true-->1;"2"-->2;2!=1)

      "true" == true//false(true-->1;"true"-->NaN;1!=NaN)

      "2" ? true : false//true(because string is non-empty)
      "abc" == new String("abc")//true(object->string)

三、得出結論和建議?

    鑑於==的對比規則會出現一些意想不到的結果,建議儘可能多使用===,而非==。

參考文章:

http://www.2ality.com/2011/06/javascript-equality.html

https://www.zhihu.com/question/31442029

相關文章
相關標籤/搜索