? :)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を参照すると、偽り値の網羅的なリストを作成できます。
undefinednullfalse0、NaN0n''その他のすべての値(すべてのオブジェクトを含む)は真り値です。
> Boolean('abc')
true
> Boolean([])
true
> Boolean({})
trueif (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つの式はおおよそ同等です。
a && b
!a ? a : b例
> false && true
false
> false && 'abc'
false
> true && false
false
> true && 'abc'
'abc'
> '' && 'abc'
''||)式a || b(「aまたはb」)は次のように評価されます。
aを評価します。bを評価して結果を返します。言い換えれば、次の2つの式はおおよそ同等です。
a || b
a ? a : b例
> true || false
true
> true || 'abc'
true
> false || true
true
> 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を返します。例
> !false
true
> !true
false
> !0
true
> !123
false
> !''
true
> !'abc'
false クイズ
クイズアプリを参照してください。