運算符:布爾運算符


運算符:布爾運算符

概述

布爾運算符用於將表達式轉為布爾值,一共包含四個運算符。

  • 取反運算符:!
  • 且運算符:&&
  • 或運算符:||
  • 三元運算符:?:

取反運算符(!)

取反運算符是一個感嘆號,用於將布爾值變為相反值,即true變成falsefalse變成true

!true // false
!false // true

對於非布爾值,取反運算符會將其轉為布爾值。可以這樣記憶,以下六個值取反后為true,其他值都為false

  • undefined
  • null
  • false
  • 0
  • NaN
  • 空字符串(''
!undefined // true
!null // true
!0 // true
!NaN // true
!"" // true

!54 // false
!'hello' // false
![] // false
!{} // false

上面代碼中,不管什么類型的值,經過取反運算后,都變成了布爾值。

如果對一個值連續做兩次取反運算,等於將其轉為對應的布爾值,與Boolean函數的作用相同。這是一種常用的類型轉換的寫法。

!!x
// 等同於
Boolean(x)

上面代碼中,不管x是什么類型的值,經過兩次取反運算后,變成了與Boolean函數結果相同的布爾值。所以,兩次取反就是將一個值轉為布爾值的簡便寫法。

且運算符(&&)

且運算符(&&)往往用於多個表達式的求值。

它的運算規則是:如果第一個運算子的布爾值為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結構,比如下面是一段if結構的代碼,就可以用且運算符改寫。

if (i) {
  doSomething();
}

// 等價於

i && doSomething();

上面代碼的兩種寫法是等價的,但是后一種不容易看出目的,也不容易除錯,建議謹慎使用。

且運算符可以多個連用,這時返回第一個布爾值為false的表達式的值。如果所有表達式的布爾值都為true,則返回最后一個表達式的值。

true && 'foo' && '' && 4 && 'foo' && true
// ''

1 && 2 && 3
// 3

上面代碼中,例一里面,第一個布爾值為false的表達式為第三個表達式,所以得到一個空字符串。例二里面,所有表達式的布爾值都是true,所以返回最后一個表達式的值3

或運算符(||)

或運算符(||)也用於多個表達式的求值。它的運算規則是:如果第一個運算子的布爾值為true,則返回第一個運算子的值,且不再對第二個運算子求值;如果第一個運算子的布爾值為false,則返回第二個運算子的值。

't' || '' // "t"
't' || 'f' // "t"
'' || 'f' // "f"
'' || '' // ""

短路規則對這個運算符也適用。

var x = 1;
true || (x = 2) // true
x // 1

上面代碼中,或運算符的第一個運算子為true,所以直接返回true,不再運行第二個運算子。所以,x的值沒有改變。這種只通過第一個表達式的值,控制是否運行第二個表達式的機制,就稱為“短路”(short-cut)。

或運算符可以多個連用,這時返回第一個布爾值為true的表達式的值。如果所有表達式都為false,則返回最后一個表達式的值。

false || 0 || '' || 4 || 'foo' || true
// 4

false || 0 || ''
// ''

上面代碼中,例一里面,第一個布爾值為true的表達式是第四個表達式,所以得到數值4。例二里面,所有表達式的布爾值都為false,所以返回最后一個表達式的值。

或運算符常用於為一個變量設置默認值。

function saveText(text) {
  text = text || '';
  // ...
}

// 或者寫成
saveText(this.text || '')

上面代碼表示,如果函數調用時,沒有提供參數,則該參數默認設置為空字符串。

三元條件運算符(?:)

三元條件運算符由問號(?)和冒號(:)組成,分隔三個表達式。它是 JavaScript 語言唯一一個需要三個運算子的運算符。如果第一個表達式的布爾值為true,則返回第二個表達式的值,否則返回第三個表達式的值。

't' ? 'hello' : 'world' // "hello"
0 ? 'hello' : 'world' // "world"

上面代碼的t0的布爾值分別為truefalse,所以分別返回第二個和第三個表達式的值。

通常來說,三元條件表達式與if...else語句具有同樣表達效果,前者可以表達的,后者也能表達。但是兩者具有一個重大差別,if...else是語句,沒有返回值;三元條件表達式是表達式,具有返回值。所以,在需要返回值的場合,只能使用三元條件表達式,而不能使用if..else

console.log(true ? 'T' : 'F');

上面代碼中,console.log方法的參數必須是一個表達式,這時就只能使用三元條件表達式。如果要用if...else語句,就必須改變整個代碼寫法了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM