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