比較運算子會比較兩個運算元的值,並評估所形成的陳述式是否為 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
:
0
null
undefined
NaN
- 空字串 (
""
)
所有其他值都會強制轉換為 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
進行隨堂測驗
哪個運算子表示「完全相等」?
===
==
=
!=