運算值的結果並非永遠都是布林值
邏輯運算值的三個屬性
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,則回傳最後一個值。實際應用,可以用來執行第二個操作順位的代碼。