JavaScript 布爾運算符

2023-03-20 15:57 更新

概述

布爾運算符用于將表達(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"

上面代碼的t0的布爾值分別為truefalse,所以分別返回第二個和第三個表達(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語句,就必須改變整個代碼寫法了。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號