JavaScript:&& and || operators 邏輯運算符

Posted by Emily is coding on Wednesday, January 4, 2023

運算值的結果並非永遠都是布林值

邏輯運算值的三個屬性

1.他們可以使用任何數據類型

2.他們可以return任何數據類型,我們稱它為短路(short circuiting)、短路評估(short circuit evaluation)

or 運算符短路short circuiting

短路(short circuiting)意指 當第一個判斷比較的第一個值是一個真實的值,它會直接回傳第一個值。另外一個值甚至不會被評估到。

console.log(3 || 'Jonas')
//print 3 

console.log(''||'jonas')
//print jonas 

console.log(true || 0)
//因為true 所以 true

console.log(undefined || null)
//print null

console.log(''||'jonas')
  • 因為’‘是一個false值,所以第二個值會被評估,因為第二個值是一個真實的值,所以會被return,就打印出 jonas

 console.log(undefined || null)
  • 因為undefined是false,所以第二個值會被評估,評比到最後一個沒得選了,所以就回傳該值null,就算null是false
console.log(undefined || 0 || '' || 'hello' || 23 || null)
//print hello
  • undefined > false 0 > false ’’ > false hello > 整個or操作鏈遇到的第一個真實值,所以return hello

or 解釋

可以理解為,or判斷式中,如果結果是true,那操作數中至少要有一個為true,所以如果第一個操作數已經為true了,那javascript就不用看其他值了,因為表達式無論如何都會是真,所以它會短路(short circuiting)簡單返回第一個結果

取代三元運算子 實例


restaurant.numGuest =23
const guest1 = restaurant.numGuest ? restaurant.numGuest : 10
//如果numGuest無值,就預設為10
console.log(guest1) //23

const guest2 = reataurant.numGuests || 10
//意義同上
console.log(guest2) //23

*注意:當numGuest = 0 時,所得到的值會是10而不是原本的值0,因為0是false,所以當然就不會被回傳,因此在這裡可以直接將0為false作為判斷,當0時,就回傳預設值10。

空合併運算符/無效合併運算符nullish coalescing operator

問題情境

const restaurant.numGuests = 0
const guest2 = restaurant.numGuests || 10
console.log(guest2) 
//print 10

雖然restaurant.numGuests確實有數值0,但因為0代表false所以仍會回傳預設值10,我們可以以nullish coalescing operator解決這問題

使用nullish coalescing operator

const restaurant.numGuests = 0
const guest2 = restaurant.numGuests ?? 10
console.log(guest2) 
//print 0

解釋:??空合併運算符,只有空值(null)與undefined,會回傳第一個非空值,也就是說 0 、" “,不會被評估為FALSE,所以就能順利被評選出來。

and 運算符短路short circuiting

&& 的作用方法 與 or 完全相反,&&會回傳第一個錯誤值,而不會評估後面的值。

console.log( 0 && 'jonas')
//print  0 (0為false)

console.log(7 && 'jonas')
//print jonas
//
  • console.log(7 && ‘jonas’),因為7是true所以被跳過,最後判斷到jonas,也是true,只好回傳最後值

and解釋

可以理解為,&&判斷式要為true,就要一切為真,所以意味著如果第一個值是false,那就整個表達式都不用看了,所以短路直接回傳false值,或評比到最後一個的值

console.log('hello' && 23 && null && 'jonas')

//print null

因為null是false值

取代if判斷是否存在,執行 實例


if(restaurant.orderPizza){
restaurant.orderPizza('mushroom')
}
//如果函式存在,則執行函式

restaurant.orderPizza && restaurant.orderPizza('mushroom')

如果restaurant.orderPizza則執行回傳後方值,取代原本的if判斷寫法

小結

  • or 判斷式,會回傳第一個true值,或如果都是false,則回傳最後一個值。實際應用,可以用or來設置默認值。

  • && 判斷式,會回傳第一個false值,或如果都是true,則回傳最後一個值。實際應用,可以用來執行第二個操作順位的代碼。