あらゆる値には真偽の「気分」がある
JavaScript では、真偽値が期待される場所に どんな値でも 置けます。if の中でも、while の条件でも、&& や || の隣でもOKです。そこに値を置くと、自動的に true か false に変換されます。false に変換される値を falsy、それ以外の値はすべて truthy と呼びます。
変換関数も明示的なキャストも不要で、JavaScript が自動でやってくれます。ルールは小さくて固定されているので、falsy な値さえ覚えてしまえば、あとは全部その裏返しで説明がつきます。
falsy 値の完全リスト
falsy になる値はきっかり7つ。それ以外は言語内のすべてが truthy です。
これだけです。リストはこう:
false— 真偽値そのもの。0と-0— どちらのゼロも。0n— BigInt のゼロ。""— 空文字列(シングル・ダブル・バッククォート、どれでも同じ)。null— 「意図的に何もない」ことを表す値。undefined— 「まだセットされていない」値。NaN—0 / 0のような無効な計算の結果。
この7つを覚えてください。あとは判定に迷う値が出てきたら、「この7つのどれかに当てはまる?」と自問するだけ。当てはまらなければ truthy です。
意外と truthy なやつら: "0"、[]、{}
ここで初心者はだいたいハマります。_見た目は_空っぽでも truthy な値はけっこうあるんです:
文字列が falsy になるのは、文字数がゼロのときだけです。"0" は1文字あるので truthy 扱いになります。配列とオブジェクトは、中身が空でも必ず truthy です。JavaScript ではこれらをオブジェクトとして扱い、オブジェクトは中身にかかわらずすべて truthy になるからです。
Python から来た人にとっては、ここが一番戸惑うポイントかもしれません。Python では [] や {} は falsy ですが、JavaScript では違います。
「空かどうか」を正しく判定する方法
[] や {} は truthy なので、if にそのまま渡して空判定に使うことはできません。次のように明示的に書きましょう。
文字列の場合も、空白だけの文字列を「空」として扱いたいなら次のようにします。
Truthy / Falsy はあくまで便利な省略記法であって、「データにとって "空" とは何か」をきちんと考える作業の代わりにはなりません。
本物の Boolean に変換する
truthy っぽい値ではなく、本当の true / false が欲しい場面もあります。定番のイディオムは次の2つです。
Boolean(x) が明示的な真偽値への変換で、!!x はその短縮記法です。最初の ! で真偽値に変換しつつ反転させ、2つ目の ! でもう一度反転して元に戻す、という仕組みですね。どちらもよく使われます。!! の方が短く書けますが、Boolean() の方が意図は読み取りやすいです。
関数からきれいな真偽値を返したいときの return 文で、!! をよく見かけます。
&& と || における Truthy / Falsy
JavaScript の論理演算子は、実は true や false を返しているわけではありません。オペランド(被演算子)のどちらか一方をそのまま返します。どちらが返ってくるかは、値の truthy / falsy によって決まります。
これが value || defaultValue というデフォルト値のイディオムが広く使われる理由です。ただし落とし穴もあります。このパターンは すべての falsy な値を同じように扱ってしまうので、0 や "" のように本来は有効な入力であるはずの値まで弾かれてしまうのです。
null か undefined のときだけフォールバックしたい場合は、代わりに Null 合体演算子 ?? を使いましょう。こちらについては別のドキュメントで詳しく解説しています。
チートシート
印刷してモニターに貼り付けたら、あとは気にせず次に進みましょう。
次は: イテレータとジェネレータ
条件分岐とループをひと通り押さえたので、次の章では JavaScript が値を「必要なときに生成する」仕組みを見ていきます。イテレータとジェネレータは、for...of やスプレッド構文、さらには最近の多くの API を支えている縁の下の力持ちです。次章でじっくり取り上げます。
よくある質問
JavaScriptでfalsyな値はどれですか?
falsyな値はちょうど7つだけです: false、0、-0、0n(BigIntのゼロ)、''(空文字列)、null、undefined、そして NaN。これ以外はすべてtruthyで、'0'、'false'、[]、{} も含めて全部truthy扱いです。このfalsyリストさえ覚えておけば、あとは消去法でどんな値でも判定できます。
空の配列 [] はtruthy? それともfalsy?
[] はtruthy? それともfalsy?truthyです。if ([]) { ... } はブロックの中が実行されます。PythonやPHPから来た人が一番驚くポイントですね。配列もオブジェクトも、中身が空かどうかに関係なく常にtruthyになります。配列が空かどうかを判定したいなら、arr.length === 0 と明示的に書くのが正解です。
値をboolean型に変換するにはどうすればいい?
方法は2つ。明示的に書くなら Boolean(value)、短く書きたいときは !!value(否定を2回かけて元の真偽に戻すイディオム)です。どちらも同じtruthy/falsyのルールに従います。truthy判定だけで済ませず、実際の true / false の値が欲しいときに使ってください。