JavaScript 布爾運(yùn)算符

2023-03-20 15:57 更新

概述

布爾運(yùn)算符用于將表達(dá)式轉(zhuǎn)為布爾值,一共包含四個(gè)運(yùn)算符。

  • 取反運(yùn)算符:!
  • 且運(yùn)算符:&&
  • 或運(yùn)算符:||
  • 三元運(yùn)算符:?:

取反運(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)算符(&&)

且運(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)算符(||)

或運(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)算符(?:)

三元條件運(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"

上面代碼的t0的布爾值分別為truefalse,所以分別返回第二個(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ě)法了。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)