> typeof false 'boolean' > typeof true 'boolean'
值 | 轉換為布林值 |
|
|
|
|
布林值 | 與輸入相同(無需轉換) |
數字 |
|
其他數字 → | |
字串 |
|
其他字串 → | |
物件 |
|
| (作為函數呼叫,而非建構函數) |
| |
| 單一的「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
。這些組稱為假值和真值。 根據前述表格,以下皆為假值:
undefined
、null
false
0
、NaN
''
所有其他值,包括所有物件,即使是空物件、空陣列和 new Boolean(false)
,都是真值。因為 undefined
和 null
是假值,所以您可以使用 if
陳述式來檢查變數 x
是否有值
if
(
x
)
{
// x has a value
}
但要注意的是,前述檢查會將所有假值都解釋為「沒有值」,而不仅仅是 undefined
和 null
。但如果您能接受這個限制,就可以使用簡潔且既定的模式。
所有物件都是 真值:
> 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 (!) 邏輯運算子的基礎知識。
二元邏輯 運算子為:
它們總是會傳回其中一個運算元,不變更
> 'abc' || 123 'abc' > false || 123 123
如果第一個運算元已經決定結果,則不會評估第二個運算元。例如(console.log
的結果為 undefined
):
> true || console.log('Hello') true > false || console.log('Hello') Hello undefined
這對於運算子來說是不常見的行為。通常,在呼叫運算子之前會評估所有運算元(就像函式一樣)。
如果第一個運算元可以 轉換為 false
,則傳回它。否則,傳回第二個運算元:
> true && false false > false && 'def' false > '' && 'def' '' > 'abc' && 'def' 'def'
如果第一個運算元可以 轉換為 true
,則傳回它。否則,傳回第二個運算元:
> true || false true > true || 'def' true > 'abc' || 'def' 'abc' > '' || 'def' 'def'
有時 會出現值(參數、函數的結果等)可以是非值(undefined
、null
)或實際值的狀況。如果您想為前一種情況提供預設值,可以使用 Or 運算子:
theValue
||
defaultValue
函數 saveText()
的參數 text
是選用的,如果已略過,應為空字串:
function
saveText
(
text
)
{
text
=
text
||
''
;
...
}
這是 ||
作為預設運算子最常見的用法。如需瞭解更多選用參數的資訊,請參閱 選用參數。
物件 options
可能有或沒有屬性 title
。如果遺漏,設定標題時應使用值 'Untitled'
setTitle
(
options
.
title
||
'Untitled'
);
函數 countOccurrences
會計算 regex
在 str
內部符合的次數
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'
前一個呼叫較為常見。