六角學院 JS 核心筆記 (十六)【運算子、型別與文法】- 寬鬆相等、嚴格相等以及隱含轉型
前言
JavaScript 是弱型別的語言,容忍隱性的型別轉換,因此允許不同型別之間的比對 (包含 =、>、<)。
寬鬆相等 == 比對兩者型別轉換後的值、嚴格相等 === 比對兩者的型別和值。
嚴格相等
比對型別和值。
1 和 "1" 、NaN 和 "NaN" 型別不一樣,比對結果都是false。
NaN 表示 Not A Number 不是一個數字。不管嚴格還是寬鬆比對,都是 false。
+0 和 -0 雖然值不一樣。不管嚴格還是寬鬆比對,都是 true。
1 | console.log(1 === "1"); // false |
寬鬆相等
可以想成是,不同型別的比對,會先將兩邊隱性地轉換成相同型別,也就是利用包裹物件。看以下範例。
Boolean 和 String 與其他型別做比較
Boolean 和 String 與其他型別做比較時,會自動加上包裹物件 Number(),將其型別轉換為 Number。
我們可以使用 Number() 包裹型別做檢測,測試兩邊的值為何。
下面程式碼第四行,true 加上包裹物件 Number(true) 會被轉換為 1,而 "true" 加上包裹物件 Number("true") 會被轉換為 NaN,1 和 NaN 不相等,結果為false。
1 | console.log(1 == "1"); // true |
注意:null 的型別是 Null ,而 undefined 的型別是 Undefined,它們在跟 Boolean 和 String 比較時,不會自動加上包裹物件 Number() 轉換型別。但是,null 和 undefined 在寬鬆相等時,比較結果是 true。
1 | console.log(null == 0); // false,即使 Number(null) 回傳 0 |
物件與非物件做比較
物件與非物件做比較時,會自動使用非物件方的包裹物件轉換。
1 | // 1. 物件與 Number |
注意:{} 在作轉換時,會使用 String() 包裹物件。
1 | String({test: "A"}); // 回傳 "[object Object]" |
物件與物件做比較
因為型別相同,不需要利用包裹物件作轉換。而物件的變數是儲存物件的記憶體位址,如果記憶體位址相同,則不管嚴格還是寬鬆比對,結果都為 true。
1 | console.log({} == {}); // false |
詳細請參考:
JavaScript 物件深入淺出重點整理
補充資料
有兩個寬鬆相等、嚴格相等比較結果的表格,可以參考看看:
- JavaScript Equality Table - == 和 === 頁籤。if() 頁籤是關於下一章節:六角學院 JS 核心筆記 (十七)【運算子、型別與文法】- Truthy 與 Falsy
- Oh My Dear JavaScript - 上方 Relational and Equality Operators。下方 What goes through If statement 也是關於下一章節。
參考資料:
六角學院:JavaScript 核心篇 - 邁向達人之路