比較運算子會比較兩個運算元的值,並評估所形成的陳述式是否為 true 或 false。以下範例使用嚴格相等運算子 (===) 比較兩個運算元:運算式 2 + 2 和值 4。由於運算式的結果和數值 4 相同,因此這個運算式會評估為 true:
2 + 2 === 4
> true
類型強制轉換和相等
最常用的兩個比較運算子是 == (用於鬆散相等) 和 === (用於嚴格相等)。== 會盡可能將運算元強制設為相符的資料類型,以便在兩個值之間執行鬆散比較。舉例來說,即使比較的是數值和字串值,2 == "2" 也會傳回 true。
2 == 2
> true
2 == "2"
> true
!= 也是如此,只有在比較的運算元「不」大致相等時,才會傳回 true。
2 != 3
> true
2 != "2"
> false
使用 === 或 !== 進行的嚴格比較不會執行類型強制轉換。如要讓嚴格比較運算結果為 true,比較的值必須具有相同的資料類型。因此,2 == "2" 會傳回 true,但 2 === "2" 會傳回 false:
2 === 3
> false
2 === "2"
> false
為避免自動強制轉換可能造成的模糊情形,請盡可能使用 ===。
| 運算子 | 說明 | 用量 | 結果 |
|---|---|---|---|
| === | 嚴格相等 | 2 === 2 | true |
| !== | 不完全相等 | 2 !== "2" | true |
| == | 相等 (或「鬆散相等」) | 2 == "2" | true |
| != | 不等於 | 2 != "3" | true |
| > | 大於 | 3 > 2 | true |
| >= | 大於或等於 | 2 >= 2 | true |
| < | 小於 | 2 < 3 | true |
| <= | 小於或等於 | 2 <= 3 | true |
真值和假值
JavaScript 中的所有值都是隱含的 true 或 false,且可強制轉換為對應的布林值,例如使用「loosely equal」比較器。只有少數值會強制轉換為 false:
0nullundefinedNaN- 空字串 (
"")
所有其他值都會強制轉換為 true,包括任何包含一或多個字元的字串,以及所有非零數字。這類值通常稱為「真值」和「假值」。
"My string" == true
> true
100 == true
> true
0 == true
> false
邏輯運算子
使用邏輯 AND (&&)、OR (||) 和 NOT (!) 運算子,根據對兩個或多個條件陳述式進行評估,控制指令碼的流程:
2 === 3 || 5 === 5;
> true
2 === 2 && 2 === "2"
> false
2 === 2 && !"My string."
> false
邏輯 NOT (!) 運算式會將運算元的真值或假值設為否定,如果運算元評估為 false,則會評估為 true,如果運算元評估為 true,則會評估為 false:
true
> true
!true
> false
!false
> true
在其他資料類型 (例如數字或字串) 前面使用邏輯 NOT 運算子 (!),會將該值強制轉換為布林值,並反轉結果的真值或假值。
"string"
> "string"
!"string"
> false
0
> 0
!0
> true
常見的做法是使用兩個 NOT 運算子,快速將資料強制轉換為相符的布林值:
!!"string"
> true
!!0
> false
邏輯 AND 和 OR 運算子本身不會執行任何強制轉換。這些運算子會傳回兩個運算元之一的值,而所選運算元則由該評估決定。
邏輯 AND (&&) 只會在運算元評估為 false 時傳回兩個運算元的前一個,否則會傳回第二個運算元。在評估為布林值的比較中,只有在邏輯 AND 兩側的運算元評估為 true 時,才會傳回 true。如果任一邊的計算結果為 false,則會傳回 false。
true && false
> false
false && true
> false
false && false
> false
true && true
> true
當 && 與兩個非布林運算元一起使用時,如果第一個運算元可以強制轉換為 false,則會傳回未變更的第一個運算元。如果第一個運算元可以強制轉換為 true,則會傳回第二個運算元,而不會變更:
false && "My string"
> false
null && "My string"
> null
"My string" && false
> false
"My string" && "My second string"
> "My second string"
2 === 2 && "My string"
> "My string"
邏輯 OR (||) 只會在運算元評估為 true 時傳回兩個運算元的前一個,否則會傳回第二個運算元。在評估為布林值的比較中,如果任一運算元評估為 true,就會傳回 true,如果兩邊都沒有評估為 true,則會傳回 false:
true || false
> true
false || true
> true
true || true
> true
false || false
> false
當 || 與兩個非布林運算元一起使用時,如果可以強制轉換為 true,則會傳回第一個運算元不變。如果第一個運算元可以強制轉換為 false,則會傳回未變更的第二個運算元:
false || "My string"
> "My string"
null || "My string"
> "My string"
"My string" || false
> "My string"
"My string" || "My second string"
> "My string"
2 === 2 || "My string"
> true
空值合併運算子
在 ES2020 中推出,「空值合併運算子」(??) 只會在運算元有 null 或 undefined 以外的任何值時,傳回第一個運算元。否則,則會傳回第二個運算元。
null ?? "My string"
> "My string"
undefined ?? "My string"
> "My string"
true ?? "My string";
> true
?? 與邏輯 OR 類似,但在評估第一個運算元的做法上更為嚴格。|| 會針對任何可強制轉換為 false 的運算式傳回第二個運算子,包括 undefined 和 null。?? 只會在第一個運算元完全等於 null 或 undefined 時傳回第二個運算元,即使可以強制轉換為 false 也一樣:
0 ?? "My string";
> 0
false ?? "My string";
> false
undefined ?? "My string";
> "My string"
邏輯指定運算子
使用指定運算子將第二個運算子的值指派給第一個運算子。最常見的例子是單一等號 (=),用於將值指派給已宣告的變數。
使用邏輯指定運算子,根據變數的真值或假值,有條件地為變數指定值。
邏輯 AND 指派運算子 (&&=) 會評估第二個運算元,並在第一個運算元評估為 true 時指派給第一個運算元,也就是說,「如果第一個運算元為 true,則改為指派第二個運算元的值:」
let myVariable = false;
myVariable &&= 2 + 2;
> false
myVariable = true;
myVariable &&= 2 + 2;
> 4
第一個運算元的值是否為真或假,會決定是否執行指派作業。不過,如果嘗試使用比較運算子評估第一個運算元,結果會是 true 或 false 布林值,無法指派值:
let myVariable = 5;
myVariable > 2 &&= "My string"
> SyntaxError: Invalid left-hand side in assignment
邏輯 OR 指派 (||=) 運算子會評估第二個運算元,並在第一個運算元評估為 false 時指派給第一個運算元,實際上等同於「如果第一個運算元為 false,則改為指派第二個運算元的值:」
let myVariable = false;
myVariable ||= 2 + 2;
> 4
myVariable = true;
myVariable ||= 2 + 2;
> true
進行隨堂測驗
哪個運算子表示「完全相等」?
======!=