比較運算子

比較運算子會比較兩個運算元的值,並評估所形成的陳述式是否為 truefalse。以下範例使用嚴格相等運算子 (===) 比較兩個運算元:運算式 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 中的所有值都是隱含的 truefalse,且可強制轉換為對應的布林值,例如使用「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 中推出,「空值合併運算子」(??) 只會在運算元有 nullundefined 以外的任何值時,傳回第一個運算元。否則,則會傳回第二個運算元。

null ?? "My string"
> "My string"

undefined ?? "My string"
> "My string"

true ?? "My string";
> true

?? 與邏輯 OR 類似,但在評估第一個運算元的做法上更為嚴格。|| 會針對任何可強制轉換為 false 的運算式傳回第二個運算子,包括 undefinednull?? 只會在第一個運算元完全等於 nullundefined 時傳回第二個運算元,即使可以強制轉換為 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

第一個運算元的值是否為真或假,會決定是否執行指派作業。不過,如果嘗試使用比較運算子評估第一個運算元,結果會是 truefalse 布林值,無法指派值:

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

進行隨堂測驗

哪個運算子表示「完全相等」?

===
==
=
!=