相等比較

JavaScript 的相等比較

相等比較為兩個值做比較判斷它們是否相等,然而在 JavaScript 中,

有三種方法可以做相等比較:

  • 一般相等

  • 嚴格相等

  • Object.is 函數

一般相等

所謂的一般相等,是藉由兩個等號做表示(==),一般相等會藉由將兩個值的型別作轉換,

將兩個值的型別一致化後,再做相等的比較,舉個例子:

1
console.log(9 == "9"); // true

結果會得到 true,因為數字 9 以及文字 9,嚴格來說本質上應該是不能相等,

但對於使用一般相等而言,會將兩個 9 的型別轉換成相同的型態再做比較。

對於布林值而言,做一般相等比較時,轉換成同一個型別,

會將 true 轉換為 1,而 false 轉換為 0。

例如:

1
console.log(0 == false); //true

此時,型別轉換,會將 false 會轉換成 0,所以比較 0 是否為 0,即會得到 true.

對於 undefined 與 null 做比較,我們使用一般相等,會得到 true 的值。

1
console.log(undefined == null); // true

不同型別的一般相等:

A == B

B 為 undefined
A 為 undefined undefined == undefined; //true
A 為 null null == undefined; //true
A 為 Number 3 == undefined; //false
A 為 String “3” == undefined; //false
A 為 Boolean true == undefined; //false
A 為 object {name:”Arance”, age:30} == undefined; //false
B 為 null
A 為 undefined undefined == null; //true
A 為 null null == null; //true
A 為 Number 3 == null; //false
A 為 String “3” == null; //false
A 為 Boolean true == null; //false
A 為 object {name:”Arance”, age:30} == null; //false
B 為 Number
A 為 undefined undefined == 3; //false
A 為 null null == 3; //false
A 為 Number 3 == 3; //true
A 為 String “3” == 3; //true
A 為 Boolean true == 3; //false
A 為 object {name:”Arance”, age:30} == 3; //false
B 為 String
A 為 undefined undefined == “3”; //false
A 為 null null == “3”; //false
A 為 Number 3 == “3”; //true
A 為 String “3” == “3”; //true
A 為 Boolean true == “3”; //false
A 為 object {name:”Arance”, age:30} == “3”; //false
B 為 Boolean
A 為 undefined undefined == true; //false
A 為 null null == true; //false
A 為 Number 3 == true; //false
A 為 String “3” == true; //false
A 為 Boolean true == true; //true
A 為 object {name:”Arance”, age:30} == true; //false
B 為 object
A 為 undefined undefined == {name:”Arance”, age:30}; //false
A 為 null null == {name:”Arance”, age:30}; //false
A 為 Number 3 == {name:”Arance”, age:30}; //false
A 為 String “3” == {name:”Arance”, age:30}; //false
A 為 Boolean true == {name:”Arance”, age:30}; //false
A 為 object {name:”Arance”, age:30} == {name:”Arance”, age:30}; //true

嚴格相等

嚴格相等是藉由三個等號做表示(===),使用嚴格相等比較時,

並不會將不同的型別轉換成相同的型別,所以兩個相同值但不同型別,會視為不同。

有兩個特別的例子在嚴格相等中:

  1. +0 與 -0 比較:
1
+0 === -0;

正零與負零做比較,會得到 true。

  1. NaN 與 NaN 比較:

而之前所提過 NaN 和 NaN 做比較會得到 false。

Object.is 函數

對於 Object.is 函數會與嚴格相等一樣,但對於 NaN、+0、-0 會獨立處理。

對於 Object.is(+0,-0)會得到 false。

對於 Object.is(NaN,NaN)會得到 true。


參考資料:

MDN - 相等比較