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


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

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM