JS 用邏輯判斷 ||(OR) 及 &&(AND) 來改寫 if (短路求值 Short-circuit evaluation)
先講結論:||
、 &&
可以幫助程式碼變得更短。
- 用
||
、&&
來改寫if - 用
||
來設定變數的預設值 - 用
&&
來檢查物件屬性是否存在
||(OR) 及 &&(AND) 介紹
||
(OR) 在判斷多個條件中,只要一個為true
時,就會回傳true
。
1 | let a = 2 |
&&
(AND) 在判斷多個條件中,必須全部為true
時,才會回傳 true
。
1 | let a = 2 |
然而我們可以用OR、AND去處理非Boolean的物件。在Javascript中,非Boolean的物件是可以被判斷為真值(truthy)
,但除了幾個物件是有被定義為假值(falsy)
:
null
NaN
0
空字串 ("" 或 '' 或 ``)
undefined
在if裡面,真值(truthy)可以轉換為true,假值(falsy)可以轉換為false
來進行OR或AND判斷。
舉例來說,我們可以判斷宣告的變數裡面有沒有值。
1 | let a = null // falsy |
但不在if裡面,直接印出來的話會發生甚麼事情?
1 | let a = null // falsy |
為何這個例子印出了12345
,而不是true
?因為OR、AND可以處理非Boolean的物件,所以稍微修改一下一開始的解釋:
||
(OR) 在判斷多個條件中,只要一個為true
真值(truthy)
時,就會回傳true
該物件
。&&
(AND) 在判斷多個條件中,必須全部為true
真值(truthy)
時,才會回傳true
該物件
。
短路求值 Short-circuit evaluation
短路求值在維基百科的解釋:
只有當第一個運算數的值無法確定邏輯運算的結果時,才對第二個運算數進行求值。例如,當AND的第一個運算數的值為false時,其結果必定為false;當OR的第一個運算數為true時,最後結果必定為true,在這種情況下,就不需要知道第二個運算數的具體值。
在MDN的解釋:
The logical AND expression is evaluated left to right, it is tested for possible “short-circuit” evaluation using the following rule:
(some falsy expression) && expr
is short-circuit evaluated to the falsy expression;Short circuit means that the expr part above is not evaluated,
The logical OR expression is evaluated left to right, it is tested for possible “short-circuit” evaluation using the following rule:
(some truthy expression) || expr
is short-circuit evaluated to the truthy expression.Short circuit means that the expr part above is not evaluated,
大概翻譯:
- AND 表達式是從左計算到右,在短路求值的計算中,如果左邊的表達式計算出來是
假值(falsy)
,那右邊的表達式就不會計算(執行)。 - OR 表達式是從左計算到右,在短路求值的計算中,如果左邊的表達式計算出來是
真值(truthy)
,那右邊的表達式就不會計算(執行)。
依照這樣的邏輯,我們就可以用來改寫if,或是更進階的應用。
額外補充
AND跟OR的優先順序是AND優先,如果混著用的話就會先做AND
1 | true || false && false // returns true, because && is executed first |
短路求值應用
如果data沒有資料的時候,要印出「沒有data」的訊息。
1 | let data = null |
如果data有資料的時候,要把資料印出來。
1 | let data = '12345' |
不知道data有沒有值,沒有的話就給預設值。
1 | function getData(data) { |
如果person有job的屬性,就要印出person的job。
1 | const person1 = { |
延伸閱讀
Logical AND (&&) - JavaScript | MDN
Logical OR (||) - JavaScript | MDN
短路求值
JavaScript基本功修練:Day9 - 短路求值與條件運算子的應用
JavaScript: What is short-circuit evaluation? | by Brandon Morelli | codeburst
JS 中 if / if…else…替换方式