js中==和===的區別以及總結

默然晴天發表於2021-07-30

js中==和===的區別以及總結

學習js時我們會遇到 == 和 === 兩種符號,現做總結如下

兩種符號的定義

  "==" 叫做相等運算子

  "===" 叫做嚴格相等運算子(全等運算子)

 

它們之間的區別

 

  "==" 只判斷等號兩邊的值是否相等,而不判斷型別是否相同。值相同則返回 true

  "===" 既要判斷值是否相等,也要判斷型別是否相同,即全等才能返回 true

 

總結:

(分析 ==)

 

先把等號兩側的值轉化為基本資料型別,如果兩側的值基本資料型別不同,轉化為數字再進行比較,如果相同,直接比較

 

1、undefined 和 null 互相比較返回 true,和自身比較也返回 true,其他情況返回 false

2、Infinity 只和自身比較返回 true

3、NaN,{} 和任意值比較都是返回 false

4、如果其中一個值是 true,則將其轉換為 1 再進行比較。如果其中一個值是 false,則將其轉換為 0 再進行比較

5、要比較相等性之前,不能將 null 和 undefined 轉換成其他任何值

6、 如果一個值是數字,另一個是字串,先將字串轉換為數值,然後使用轉換後的值進行比較

7、如果等號兩側都是物件,則比較它們是否為同一個物件。如果指向同一個物件,則返回 true,否則返回 false

 

 較為複雜的情況:

8、如果等號一側是Number,String,Boolean這三種型別中的一種,而另一側是物件型別時, 則對物件執行ToPrimitive操作(這步是JS直譯器執行的,ToPrimitive方法的實現,正是依次去呼叫物件的valueOf,toString方法,直到其中一個方法返回一個基本值,然後比較返回的基本值和另一側那三中型別的值。如果這兩個方法沒有返回基本值 ,那就認定不相等 )

 

 

(分析 ===)

1、先分析是否為相同型別,如果型別不同直接返回 false,

  如果型別相同,

    基本型別,直接比較值是否相同,

    物件型別,由於物件型別儲存的是物件(包括陣列,函式)的地址值,所以地址值不同的,返回的都是 false。地址值相同,返回 true

 

上面說的有些抽象,下面我們來結合具體的例項來分析一下

 

== 詳解(有隱式轉換)    

一、等號兩側是基本資料型別,且型別不同時

1. 字串與數字比較 (等號兩側轉化為數字,再比較)

  100 == "100"  ==>  100 == 100  // true

  100 == "99"  ==>  100 == 99  // false

  100 == "abc"  ==>  100 == NaN  // false

  1 == "abc"  ==>  1 == NaN  // false

  1 == ""  ==>  1 == 0  // false

 

2.字串與布林值比較(等號兩側轉換為數字,再比較)

  "abc" == true  ==>  NaN == 1  // false

  "abc" == false  ==>  NaN == 0  // false

  "" == true  ==>  0 == 1  // false

  "" == false  ==>  0 == 0  // true

 

3.數字與布林值比較(等號兩側轉換為數字,再比較)

  1 == true  ==>  1 == 1  // true

  0 == true  ==>  0 == 1  // false

  100 == true  ==>  100 == 1  // false

  1 == false  ==>  1 == 0  // false

  0 == false  ==>  0 == 0  // true

  100 == false  ==>  100 == 0  // false

 

4. undefined 和 null

  undefined 與 null 比較特殊    要比較相等性之前,不能將 null 和 undefined 轉換成其他任何值

  undefined 和 null 互相比較返回 true,和自身比較也返回 true,其他情況返回 false

  undefiend == undefined  // true

  undefined == null  // true

  null == null  // true

  undefined == 其他值  // false

  null == 其他值  // false

 

5. NaN

  NaN(非數值)也很特殊,NaN 和任何值(包括自己)比較都是返回 false

 

  NaN == NaN  // false

  NaN == 其他值  // false

 

二、等號兩側有複雜資料型別(引用型別)時,且型別不同時

  (特殊:{} 和任何值比較返回都是false )

1.等號兩側都為引用型別時

  (由於引用型別儲存的是物件(包括陣列,函式)的地址值,所以地址值不同的,返回的都是 false)

等號兩側為相同的引用資料型別時 

  例項

  [1,2] == [1,2]  // false

  [1,2] == [2,3]  // false

  {x:1} == {x:1}  // false

  {x:1} == {y:1}  // false

等號兩側為不同的引用資料型別時

  例項

  [1,2] == {y:1}  // false

  

2.有且只有一側為引用資料型別時

  例項

  [1,2] == 1  ==>  NaN == 1  // false

  [1,2] == true  ==>  NaN == 1  // false

  [ 1 ] == 1  ==>  1 == 1  // true

  [1] == '1'  ==>  '1' == '1'  // true

  

  [] == 0  ==>  0 == 0  // true

  [] == '0'  ==>  '' == '0'  // false

  [] == ''  ==>  '' == ''  // true

 

  {x:1} == 1  ==>  NaN == 1  // false

  {x:1} == '1'  ==>  NaN == 1  // false

  true == {x:1}  ==>  1 == NaN  // false

 

=== 詳解(無隱式轉換)

  例項

  100 == "100"  // false

  100 == 100  // true

  "100" == "100"  // true

  {x:1} == {y:1}  // false

 

  

 

相關文章