W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
布爾運算符用于將表達(dá)式轉(zhuǎn)為布爾值,一共包含四個運算符。
!
&&
||
?:
取反運算符是一個感嘆號,用于將布爾值變?yōu)橄喾粗担?code>true變成false
,false
變成true
。
!true // false
!false // true
對于非布爾值,取反運算符會將其轉(zhuǎn)為布爾值。可以這樣記憶,以下六個值取反后為true
,其他值都為false
。
undefined
null
false
0
NaN
''
)!undefined // true
!null // true
!0 // true
!NaN // true
!"" // true
!54 // false
!'hello' // false
![] // false
!{} // false
上面代碼中,不管什么類型的值,經(jīng)過取反運算后,都變成了布爾值。
如果對一個值連續(xù)做兩次取反運算,等于將其轉(zhuǎn)為對應(yīng)的布爾值,與Boolean
函數(shù)的作用相同。這是一種常用的類型轉(zhuǎn)換的寫法。
!!x
// 等同于
Boolean(x)
上面代碼中,不管x
是什么類型的值,經(jīng)過兩次取反運算后,變成了與Boolean
函數(shù)結(jié)果相同的布爾值。所以,兩次取反就是將一個值轉(zhuǎn)為布爾值的簡便寫法。
且運算符(&&
)往往用于多個表達(dá)式的求值。
它的運算規(guī)則是:如果第一個運算子的布爾值為true
,則返回第二個運算子的值(注意是值,不是布爾值);如果第一個運算子的布爾值為false
,則直接返回第一個運算子的值,且不再對第二個運算子求值。
't' && '' // ""
't' && 'f' // "f"
't' && (1 + 2) // 3
'' && 'f' // ""
'' && '' // ""
var x = 1;
(1 - 1) && ( x += 1) // 0
x // 1
上面代碼的最后一個例子,由于且運算符的第一個運算子的布爾值為false
,則直接返回它的值0
,而不再對第二個運算子求值,所以變量x
的值沒變。
這種跳過第二個運算子的機制,被稱為“短路”。有些程序員喜歡用它取代if
結(jié)構(gòu),比如下面是一段if
結(jié)構(gòu)的代碼,就可以用且運算符改寫。
if (i) {
doSomething();
}
// 等價于
i && doSomething();
上面代碼的兩種寫法是等價的,但是后一種不容易看出目的,也不容易除錯,建議謹(jǐn)慎使用。
且運算符可以多個連用,這時返回第一個布爾值為false
的表達(dá)式的值。如果所有表達(dá)式的布爾值都為true
,則返回最后一個表達(dá)式的值。
true && 'foo' && '' && 4 && 'foo' && true
// ''
1 && 2 && 3
// 3
上面代碼中,例一里面,第一個布爾值為false
的表達(dá)式為第三個表達(dá)式,所以得到一個空字符串。例二里面,所有表達(dá)式的布爾值都是true
,所以返回最后一個表達(dá)式的值3
。
或運算符(||
)也用于多個表達(dá)式的求值。它的運算規(guī)則是:如果第一個運算子的布爾值為true
,則返回第一個運算子的值,且不再對第二個運算子求值;如果第一個運算子的布爾值為false
,則返回第二個運算子的值。
't' || '' // "t"
't' || 'f' // "t"
'' || 'f' // "f"
'' || '' // ""
短路規(guī)則對這個運算符也適用。
var x = 1;
true || (x = 2) // true
x // 1
上面代碼中,或運算符的第一個運算子為true
,所以直接返回true
,不再運行第二個運算子。所以,x
的值沒有改變。這種只通過第一個表達(dá)式的值,控制是否運行第二個表達(dá)式的機制,就稱為“短路”(short-cut)。
或運算符可以多個連用,這時返回第一個布爾值為true
的表達(dá)式的值。如果所有表達(dá)式都為false
,則返回最后一個表達(dá)式的值。
false || 0 || '' || 4 || 'foo' || true
// 4
false || 0 || ''
// ''
上面代碼中,例一里面,第一個布爾值為true
的表達(dá)式是第四個表達(dá)式,所以得到數(shù)值4。例二里面,所有表達(dá)式的布爾值都為false
,所以返回最后一個表達(dá)式的值。
或運算符常用于為一個變量設(shè)置默認(rèn)值。
function saveText(text) {
text = text || '';
// ...
}
// 或者寫成
saveText(this.text || '')
上面代碼表示,如果函數(shù)調(diào)用時,沒有提供參數(shù),則該參數(shù)默認(rèn)設(shè)置為空字符串。
三元條件運算符由問號(?)和冒號(:)組成,分隔三個表達(dá)式。它是 JavaScript 語言唯一一個需要三個運算子的運算符。如果第一個表達(dá)式的布爾值為true
,則返回第二個表達(dá)式的值,否則返回第三個表達(dá)式的值。
't' ? 'hello' : 'world' // "hello"
0 ? 'hello' : 'world' // "world"
上面代碼的t
和0
的布爾值分別為true
和false
,所以分別返回第二個和第三個表達(dá)式的值。
通常來說,三元條件表達(dá)式與if...else
語句具有同樣表達(dá)效果,前者可以表達(dá)的,后者也能表達(dá)。但是兩者具有一個重大差別,if...else
是語句,沒有返回值;三元條件表達(dá)式是表達(dá)式,具有返回值。所以,在需要返回值的場合,只能使用三元條件表達(dá)式,而不能使用if..else
。
console.log(true ? 'T' : 'F');
上面代碼中,console.log
方法的參數(shù)必須是一個表達(dá)式,這時就只能使用三元條件表達(dá)式。如果要用if...else
語句,就必須改變整個代碼寫法了。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: