Back To Articles

JavaScript 兩個等號與三個等號有什麼不同

🧑🏻‍💻 Huang, Yung-Hsiang 📅 August 3, 2019

Article Image

過去學過 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。

重點節錄

  • == 在比較前會先自動轉換型別,再比較雙方的值
  • === 是嚴格比較,會比較型別與值
  • 寬鬆比較布林值與其它值的時候要注意強制轉換的結果
  • 乾脆只使用嚴格相等就好,寬鬆相等還是少用為妙

以上資源是我自己整理過後的筆記,若有錯誤歡迎隨時和我聯繫