焦らず学ぶJavaScript(ES2022版)
本書をサポートしてください:購入 または 寄付
(広告です。ブロックしないでください。)

15 ブール値



プリミティブ型 *boolean* は、falsetrue の2つの値で構成されます。

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

15.1 ブール値への変換

  「[型]への変換」の意味

「[型]への変換」は、「任意の値を[型]の値に変換する」ことです。

任意の値xをブール値に変換するには、3つの方法があります。

4は、さまざまな値がブール値に変換される方法を示しています。

表 4:値をブール値に変換します。
x Boolean(x)
undefined false
null false
boolean x(変更なし)
number 0 falseNaN false
その他の数値 true
bigint 0 false
その他の数値 true
string '' false
その他の文字列 true
symbol true
object 常にtrue

15.2 偽り値と真り値

if文、whileループ、またはdo-whileループの条件を確認する場合、JavaScriptは予想とは異なる動作をします。たとえば、次の条件を考えてみましょう。

if (value) {}

多くのプログラミング言語では、この条件は次の条件と同等です。

if (value === true) {}

しかし、JavaScriptでは、これは次の条件と同等です。

if (Boolean(value) === true) {}

つまり、JavaScriptは、ブール値に変換されたときにvaluetrueかどうかを確認します。この種のチェックは非常に一般的であるため、次の名前が導入されました。

各値は真り値または偽り値のいずれかです。表 4を参照すると、偽り値の網羅的なリストを作成できます。

その他のすべての値(すべてのオブジェクトを含む)は真り値です。

> Boolean('abc')
true
> Boolean([])
true
> Boolean({})
true

15.2.1 真り値または偽り値の確認

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

15.3 真り値に基づく存在チェック

JavaScriptでは、存在しないもの(たとえば、存在しないパラメータやプロパティ)を読み取ると、通常はundefinedが返されます。このような場合、存在チェックは値をundefinedと比較することになります。たとえば、次のコードは、オブジェクトobjにプロパティ.propがあるかどうかを確認します。

if (obj.prop !== undefined) {
  // obj has property .prop
}

undefinedが偽り値であるため、このチェックは次のように短縮できます。

if (obj.prop) {
  // obj has property .prop
}

15.3.1 落とし穴:真り値に基づく存在チェックは不正確である

真り値に基づく存在チェックには、1つの落とし穴があります。それは、あまり正確ではないということです。前の例を考えてみましょう。

if (obj.prop) {
  // obj has property .prop
}

if文の本体は、次の場合にスキップされます。

しかし、次の場合にもスキップされます。

実際には、これはめったに問題を引き起こしませんが、この落とし穴を認識しておく必要があります。

15.3.2 ユースケース:パラメータが渡されたか?

真り値チェックは、関数の呼び出し元がパラメータを渡したかどうかを判断するために頻繁に使用されます。

function func(x) {
  if (!x) {
    throw new Error('Missing parameter x');
  }
  // ···
}

利点としては、このパターンが確立されており、短いことです。undefinednullに対して正しくエラーをスローします。

欠点としては、前述の落とし穴があります。このコードは、その他の偽り値に対してもエラーをスローします。

別の方法として、undefinedを確認できます。

if (x === undefined) {
  throw new Error('Missing parameter x');
}

15.3.3 ユースケース:プロパティが存在するか?

真り値チェックは、プロパティが存在するかどうかを判断するためにも頻繁に使用されます。

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');
}

15.4 条件演算子(? :

条件演算子は、if文の式バージョンです。構文は次のとおりです。

«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'

15.5 二項論理演算子:論理積(x && y)、論理和(x || y

二項論理演算子&&||は、*値を保持*し、*短絡評価*します。

15.5.1 値の保持

値の保持とは、オペランドはブール値として解釈されますが、変更されずに返されることを意味します。

> 12 || 'hello'
12
> 0 || 'hello'
'hello'

15.5.2 短絡評価

短絡評価とは、最初のオペランドが既に結果を決定している場合、2番目のオペランドは評価されないことを意味します。オペランドの評価を遅らせる他の演算子は、条件演算子だけです。通常、すべてのオペランドは演算を実行する前に評価されます。

たとえば、論理積(&&)は、最初のオペランドが偽り値の場合、2番目のオペランドを評価しません。

const x = false && console.log('hello');
// No output

最初のオペランドが真り値の場合、console.log()が実行されます。

const x = true && console.log('hello');

// Output:
// 'hello'

15.5.3 論理積(x && y

a && b(「ab」)は次のように評価されます。

  1. aを評価します。
  2. 結果が偽り値ですか?それを返します。
  3. それ以外の場合は、bを評価して結果を返します。

言い換えれば、次の2つの式はおおよそ同等です。

a && b
!a ? a : b

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

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

> '' && 'abc'
''

15.5.4 論理和(||

a || b(「aまたはb」)は次のように評価されます。

  1. aを評価します。
  2. 結果が真り値ですか?それを返します。
  3. それ以外の場合は、bを評価して結果を返します。

言い換えれば、次の2つの式はおおよそ同等です。

a || b
a ? a : b

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

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

> 'abc' || 'def'
'abc'
15.5.4.1 論理和(||)のレガシーなユースケース:デフォルト値の提供

ECMAScript 2020では、デフォルト値にnullish coalescing演算子(??)が導入されました。それ以前は、この目的で論理和が使用されていました。

const valueToUse = receivedValue || defaultValue;

??と、この場合の||の欠点の詳細については、§14.4「デフォルト値のためのnullish coalescing演算子(??)[ES2020]」を参照してください。

  レガシー演習:または演算子(||)によるデフォルト値

exercises/booleans/default_via_or_exrc.mjs

15.6 論理否定(!

!x(「xでない」)は次のように評価されます。

  1. xを評価します。
  2. 真り値ですか?falseを返します。
  3. それ以外の場合は、trueを返します。

> !false
true
> !true
false

> !0
true
> !123
false

> !''
true
> !'abc'
false

  クイズ

クイズアプリを参照してください。