? :
)x && y
)、論理和(x || y
)x && y
)||
)!
)プリミティブ型 *boolean* は、false
と true
の2つの値で構成されます。
> typeof false'boolean'
> typeof true'boolean'
「[型]への変換」の意味
「[型]への変換」は、「任意の値を[型]の値に変換する」ことです。
任意の値x
をブール値に変換するには、3つの方法があります。
Boolean(x)
最も記述的で推奨されます。
x ? true : false
条件演算子を使用します(この章の後述)。
!!x
論理否定演算子(!
)を使用します。この演算子はオペランドをブール値に変換します。否定されていない結果を得るために、2回適用されます。
表 4は、さまざまな値がブール値に変換される方法を示しています。
x |
Boolean(x) |
---|---|
undefined |
false |
null |
false |
boolean | x (変更なし) |
number | 0 → false 、NaN → false |
その他の数値 → true |
|
bigint | 0 → false |
その他の数値 → true |
|
string | '' → false |
その他の文字列 → true |
|
symbol | true |
object | 常にtrue |
if
文、while
ループ、またはdo-while
ループの条件を確認する場合、JavaScriptは予想とは異なる動作をします。たとえば、次の条件を考えてみましょう。
if (value) {}
多くのプログラミング言語では、この条件は次の条件と同等です。
if (value === true) {}
しかし、JavaScriptでは、これは次の条件と同等です。
if (Boolean(value) === true) {}
つまり、JavaScriptは、ブール値に変換されたときにvalue
がtrue
かどうかを確認します。この種のチェックは非常に一般的であるため、次の名前が導入されました。
true
になる値は、*真り値*と呼ばれます。false
になる値は、*偽り値*と呼ばれます。各値は真り値または偽り値のいずれかです。表 4を参照すると、偽り値の網羅的なリストを作成できます。
undefined
null
false
0
、NaN
0n
''
その他のすべての値(すべてのオブジェクトを含む)は真り値です。
> Boolean('abc')true
> Boolean([])true
> Boolean({})true
if (x) {
// x is truthy
}
if (!x) {
// x is falsy
}
if (x) {
// x is truthy
else {
} // x is falsy
}
const result = x ? 'truthy' : 'falsy';
最終行で使用されている条件演算子については、この章の後述します。
演習:真り値
exercises/booleans/truthiness_exrc.mjs
JavaScriptでは、存在しないもの(たとえば、存在しないパラメータやプロパティ)を読み取ると、通常はundefined
が返されます。このような場合、存在チェックは値をundefined
と比較することになります。たとえば、次のコードは、オブジェクトobj
にプロパティ.prop
があるかどうかを確認します。
if (obj.prop !== undefined) {
// obj has property .prop
}
undefined
が偽り値であるため、このチェックは次のように短縮できます。
if (obj.prop) {
// obj has property .prop
}
真り値に基づく存在チェックには、1つの落とし穴があります。それは、あまり正確ではないということです。前の例を考えてみましょう。
if (obj.prop) {
// obj has property .prop
}
if
文の本体は、次の場合にスキップされます。
obj.prop
が存在しない場合(その場合、JavaScriptはundefined
を返します)。しかし、次の場合にもスキップされます。
obj.prop
がundefined
の場合。obj.prop
がその他の偽り値(null
、0
、''
など)の場合。実際には、これはめったに問題を引き起こしませんが、この落とし穴を認識しておく必要があります。
真り値チェックは、関数の呼び出し元がパラメータを渡したかどうかを判断するために頻繁に使用されます。
function func(x) {
if (!x) {
throw new Error('Missing parameter x');
}// ···
}
利点としては、このパターンが確立されており、短いことです。undefined
とnull
に対して正しくエラーをスローします。
欠点としては、前述の落とし穴があります。このコードは、その他の偽り値に対してもエラーをスローします。
別の方法として、undefined
を確認できます。
if (x === undefined) {
throw new Error('Missing parameter x');
}
真り値チェックは、プロパティが存在するかどうかを判断するためにも頻繁に使用されます。
function readFile(fileDesc) {
if (!fileDesc.path) {
throw new Error('Missing property: .path');
}// ···
}readFile({ path: 'foo.txt' }); // no error
このパターンも確立されており、通常の注意点があります。プロパティが存在しない場合だけでなく、存在していて偽り値のいずれかの値を持つ場合にもスローします。
プロパティが存在するかどうかを本当に確認する場合は、in
演算子を使用する必要があります。
if (! ('path' in fileDesc)) {
throw new Error('Missing property: .path');
}
? :
)条件演算子は、if
文の式バージョンです。構文は次のとおりです。
«condition» ? «thenExpression» : «elseExpression»
次のように評価されます。
condition
が真り値の場合、thenExpression
を評価して返します。elseExpression
を評価して返します。条件演算子は、3つのオペランドを持つため、*三項演算子*とも呼ばれます。
例
> true ? 'yes' : 'no''yes'
> false ? 'yes' : 'no''no'
> '' ? 'yes' : 'no''no'
次のコードは、「then」と「else」のどちらのブランチが条件によって選択されるかにかかわらず、そのブランチのみが評価されることを示しています。他のブランチは評価されません。
const x = (true ? console.log('then') : console.log('else'));
// Output:
// 'then'
x && y
)、論理和(x || y
)二項論理演算子&&
と||
は、*値を保持*し、*短絡評価*します。
値の保持とは、オペランドはブール値として解釈されますが、変更されずに返されることを意味します。
> 12 || 'hello'12
> 0 || 'hello''hello'
短絡評価とは、最初のオペランドが既に結果を決定している場合、2番目のオペランドは評価されないことを意味します。オペランドの評価を遅らせる他の演算子は、条件演算子だけです。通常、すべてのオペランドは演算を実行する前に評価されます。
たとえば、論理積(&&
)は、最初のオペランドが偽り値の場合、2番目のオペランドを評価しません。
const x = false && console.log('hello');
// No output
最初のオペランドが真り値の場合、console.log()
が実行されます。
const x = true && console.log('hello');
// Output:
// 'hello'
x && y
)式a && b
(「a
とb
」)は次のように評価されます。
a
を評価します。b
を評価して結果を返します。言い換えれば、次の2つの式はおおよそ同等です。
&& b
a !a ? a : b
例
> false && truefalse
> false && 'abc'false
> true && falsefalse
> true && 'abc''abc'
> '' && 'abc'''
||
)式a || b
(「a
またはb
」)は次のように評価されます。
a
を評価します。b
を評価して結果を返します。言い換えれば、次の2つの式はおおよそ同等です。
|| b
a ? a : b a
例
> true || falsetrue
> true || 'abc'true
> false || truetrue
> false || 'abc''abc'
> 'abc' || 'def''abc'
||
)のレガシーなユースケース:デフォルト値の提供ECMAScript 2020では、デフォルト値にnullish coalescing演算子(??
)が導入されました。それ以前は、この目的で論理和が使用されていました。
const valueToUse = receivedValue || defaultValue;
??
と、この場合の||
の欠点の詳細については、§14.4「デフォルト値のためのnullish coalescing演算子(??
)[ES2020]」を参照してください。
レガシー演習:または演算子(
||
)によるデフォルト値
exercises/booleans/default_via_or_exrc.mjs
!
)式!x
(「x
でない」)は次のように評価されます。
x
を評価します。false
を返します。true
を返します。例
> !falsetrue
> !truefalse
> !0true
> !123false
> !''true
> !'abc'false
クイズ
クイズアプリを参照してください。