過去學過 Java、C 與 Python 都沒遇過這問題,沒想到在學習 JavaScript 時會遇到三等號與雙等號的問題,滿新奇的!
等於的比較運算子
JavaScript 有三種「等號」的運算子,分別是:
- 一個等號
=
:賦值運算子,把右方的值賦予左方 - 兩個等號
==
:比較運算子,檢查左右方的值是否相等 - 三個等號
===
:比較運算子,檢查左右方的型別與值是否都相等
寬鬆相等與嚴格相等的差異在於檢查值相等時,是否會做「強制轉型」,==
會做強制轉型,而 ===
不會。
實際應用上建議一律使用嚴格比較,在開發時也比較不會出錯。
比較運算子範例
99 == "99"; // true
回傳 true,因為 JavaScript 在做 ==
的比較運算時,會自動先把右邊的 String 型別轉換成「數值」,再將兩邊的值拿來比較,因此兩邊的值一樣就會回傳 true。
📌 這邊有個記憶重點,就是寬鬆相等只會強制轉型等號的其中一邊,而且通常是把非數值的型別轉換成數值。
舉例來說,比較字串與數值時,會把字串轉成數值。
那如果兩邊都不是數值,像是比較布林值與字串的話呢?答案是會把布林值轉成數值,這個部分待會就會提到。
嚴謹比較運算子範例
99 === "99"; // false
回傳 false,因為 ===
除了比較兩邊的值是否相同之外,也會比較兩者型態是否相同。
範例當中,左邊是數字,而右邊是字串,所以會判定為不相等。
陷阱題:寬鬆比較布林值與其它型別的值
寬鬆相等沒辦法用來判斷真假值 (true or false),因為它會將「布林值」轉換成「數值」去做比較。
當寬鬆比較遇到布林值時,首先一樣是只會強制轉型其中一邊,但是布林值的轉換優先程度是最高的。
let a = true;
console.log(a == true); // true == true,得到 true
console.log(a === true); // true === true,得到 true
console.log(a === "true"); // true === 'true',得到 false
console.log(a == "true"); // true == 'true',得到 false !?
第四個 a == "true"
等同於判斷數值 1
是否等於字串 "true"
,因此最後會得到 false。
重點節錄
==
在比較前會先自動轉換型別,再比較雙方的值===
是嚴格比較,會比較型別與值- 寬鬆比較布林值與其它值的時候要注意強制轉換的結果
- 乾脆只使用嚴格相等就好,寬鬆相等還是少用為妙
以上資源是我自己整理過後的筆記,若有錯誤歡迎隨時和我聯繫