第 10 章布林值
目錄
購買書籍
(廣告,請勿封鎖。)

第 10 章布林值

原始布林值類型包含值 truefalse

> typeof false
'boolean'
> typeof true
'boolean'

轉換為布林值

轉換為布林值如下:

轉換為布林值

未定義

false

null

false

布林值

與輸入相同(無需轉換)

數字

0NaNfalse

其他數字 → true

字串

''false

其他字串 → true

物件

true(始終!)

手動轉換為布林值

三種方式可以將任何值轉換為布林值:

Boolean(value)

(作為函數呼叫,而非建構函數)

value ? true : false

!!value

單一的「not」會轉換為否定布林值;使用兩次則會轉換為非否定布林值。

我比較喜歡 Boolean(),因為它更具描述性。以下是一些範例:

> Boolean(undefined)
false
> Boolean(null)
false

> Boolean(0)
false
> Boolean(1)
true
> Boolean(2)
true

> Boolean('')
false
> Boolean('abc')
true
> Boolean('false')
true

真值和假值

在 JavaScript 需要布林值時,您可以提供任何類型的值,它會自動轉換為布林值。因此,JavaScript 中有兩組值:一組會轉換為 false,而另一組會轉換為 true。這些組稱為假值真值根據前述表格,以下皆為假值:

  • undefinednull
  • 布林值:false
  • 數字:0NaN
  • 字串:''

所有其他值,包括所有物件,即使是空物件、空陣列和 new Boolean(false),都是真值。因為 undefinednull 是假值,所以您可以使用 if 陳述式來檢查變數 x 是否有值

if (x) {
    // x has a value
}

但要注意的是,前述檢查會將所有假值都解釋為「沒有值」,而不仅仅是 undefinednull。但如果您能接受這個限制,就可以使用簡潔且既定的模式。

陷阱:所有物件都是真值

所有物件都是 真值:

> Boolean(new Boolean(false))
true
> Boolean([])
true
> Boolean({})
true

這與物件轉換為 數字或字串的方式不同,您可以在其中透過實作方法 valueOf()toString() 來控制結果:

> Number({ valueOf: function () { return 123 } })
123
> String({ toString: function () { return 'abc' } })
'abc'

歷史:為什麼物件總是真值?

轉換為布林值在歷史原因上有所不同。對於 ECMAScript 1,決定不讓物件設定該轉換(例如,透過 toBoolean() 方法)。其理由是布林運算子 ||&& 會保留其運算元的數值。因此,如果您串聯這些運算子,則可能會多次檢查同一個數值是否為真值或假值。對於基本型別來說,此類檢查很便宜,但如果物件能夠設定其轉換為布林值,則會很昂貴。ECMAScript 1 透過讓物件總是真值來避免這種成本。

邏輯運算子

在本節中,我們將介紹 And (&&)、Or (||) 和 Not (!) 邏輯運算子的基礎知識。

二元邏輯運算子:And (&&) 和 Or (||)

二元邏輯 運算子為:

保留數值

它們總是會傳回其中一個運算元,不變更

> 'abc' || 123
'abc'
> false || 123
123
短路

如果第一個運算元已經決定結果,則不會評估第二個運算元。例如(console.log 的結果為 undefined):

> true || console.log('Hello')
true
> false || console.log('Hello')
Hello
undefined

這對於運算子來說是不常見的行為。通常,在呼叫運算子之前會評估所有運算元(就像函式一樣)。

邏輯 And (&&)

如果第一個運算元可以 轉換為 false,則傳回它。否則,傳回第二個運算元:

> true && false
false
> false && 'def'
false
> '' && 'def'
''
> 'abc' && 'def'
'def'

邏輯 Or (||)

如果第一個運算元可以 轉換為 true,則傳回它。否則,傳回第二個運算元:

> true || false
true
> true || 'def'
true
> 'abc' || 'def'
'abc'
> '' || 'def'
'def'

範例 1:參數的預設值

函數 saveText() 的參數 text 是選用的,如果已略過,應為空字串:

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

這是 || 作為預設運算子最常見的用法。如需瞭解更多選用參數的資訊,請參閱 選用參數

範例 2:屬性的預設值

物件 options 可能有或沒有屬性 title。如果遺漏,設定標題時應使用值 'Untitled'

setTitle(options.title || 'Untitled');

範例 3:函數結果的預設值

函數 countOccurrences 會計算 regexstr 內部符合的次數

function countOccurrences(regex, str) {
    // Omitted: check that /g is set for `regex`
    return (str.match(regex) || []).length;
}

問題在於 match()(請參閱 String.prototype.match:擷取群組或傳回所有符合的子字串)會傳回陣列或 null。感謝 ||,後一種情況會使用預設值。因此,您可以在兩種情況下安全地存取屬性 length

邏輯非 (!)

邏輯非運算子 ! 會將其運算元轉換為布林值,然後對其取反:

> !true
false
> !43
false
> !''
true
> !{}
false

相等運算子、排序運算子

下列運算子已在其他地方涵蓋

布林函數

函數 Boolean 可以用兩種方式呼叫

Boolean(value)

作為一般函數,它會將 value 轉換為原始布林值(請參閱 轉換為布林值

> Boolean(0)
false
> typeof Boolean(false)  // no change
'boolean'
new Boolean(bool)

作為建構函數,它會建立 Boolean 的新執行個體(請參閱 基本資料型別的包裝物件),一個包裝 bool 的物件(在將其轉換為布林值後)。例如

> typeof new Boolean(false)
'object'

前一個呼叫較為常見。

下一頁:11. 數字