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 |
嚴格相等
嚴格相等是藉由三個等號做表示(===),使用嚴格相等比較時,
並不會將不同的型別轉換成相同的型別,所以兩個相同值但不同型別,會視為不同。
有兩個特別的例子在嚴格相等中:
- +0 與 -0 比較:
1 | +0 === -0; |
正零與負零做比較,會得到 true。
- NaN 與 NaN 比較:
而之前所提過 NaN 和 NaN 做比較會得到 false。
Object.is 函數
對於 Object.is 函數會與嚴格相等一樣,但對於 NaN、+0、-0 會獨立處理。
對於 Object.is(+0,-0)會得到 false。
對於 Object.is(NaN,NaN)會得到 true。