プリミティブなブール型は、true
とfalse
の値で構成されます。
> typeof false 'boolean' > typeof true 'boolean'
値 | ブール値に変換後 |
|
|
|
|
ブール値 | 入力と同じ(変換なし) |
数値 |
|
その他の数値 → | |
文字列 |
|
その他の文字列 → | |
オブジェクト |
|
任意の値をブール値に変換するには3つの方法があります。
| (コンストラクタではなく、関数として呼び出されます) |
| |
| 単一の「not」は否定されたブール値に変換されます。否定されていない変換には2回使用します。 |
より記述的であるため、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には2種類の値の集合があります。1つの集合はfalse
に変換され、もう1つの集合はtrue
に変換されます。これらの集合は、偽値(falsy values)と真値(truthy values)と呼ばれます。前述の表から、以下のすべてが偽値です。
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(!)論理演算子の基本について説明します。
2項論理演算子は次のとおりです。
常にオペランドのいずれかを変更せずに返します。
> 'abc' || 123 'abc' > false || 123 123
最初のオペランドですでに結果が決まっている場合、2番目のオペランドは評価されません。例(console.log
の結果はundefined
です):
> true || console.log('Hello') true > false || console.log('Hello') Hello undefined
これは演算子としては珍しい動作です。通常、演算子が呼び出される前にすべてのオペランドが評価されます(関数の場合と同様です)。
最初のオペランドをfalse
に変換できる場合、それを返します。そうでない場合は、2番目のオペランドを返します。
> true && false false > false && 'def' false > '' && 'def' '' > 'abc' && 'def' 'def'
最初のオペランドをtrue
に変換できる場合、それを返します。そうでない場合は、2番目のオペランドを返します。
> 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
に安全にアクセスできます。
関数Boolean
は2つの方法で呼び出すことができます。
Boolean(value)
通常の関数として、value
をプリミティブなブール値に変換します(ブール値への変換を参照)。
> Boolean(0) false > typeof Boolean(false) // no change 'boolean'
new Boolean(bool)
コンストラクタとして、Boolean
(プリミティブのラッパーオブジェクトを参照)の新しいインスタンスを作成します。これはbool
を(ブール値に変換した後)ラップするオブジェクトです。例:
> typeof new Boolean(false) 'object'
前者の呼び出し方が一般的です。