Menu
日本語

JavaScript falsyな値の完全リストとtruthy判定

JavaScriptでtruthy/falsyとみなされる値は何か。falsyな値の完全リストと、実際のコードでboolean変換がどう働くかを整理します。

あらゆる値には真偽の「気分」がある

JavaScript では、真偽値が期待される場所に どんな値でも 置けます。if の中でも、while の条件でも、&&|| の隣でもOKです。そこに値を置くと、自動的に truefalse に変換されます。false に変換される値を falsy、それ以外の値はすべて truthy と呼びます。

index.js
Output
Click Run to see the output here.

変換関数も明示的なキャストも不要で、JavaScript が自動でやってくれます。ルールは小さくて固定されているので、falsy な値さえ覚えてしまえば、あとは全部その裏返しで説明がつきます。

falsy 値の完全リスト

falsy になる値はきっかり7つ。それ以外は言語内のすべてが truthy です。

index.js
Output
Click Run to see the output here.

これだけです。リストはこう:

  • false — 真偽値そのもの。
  • 0-0 — どちらのゼロも。
  • 0n — BigInt のゼロ。
  • "" — 空文字列(シングル・ダブル・バッククォート、どれでも同じ)。
  • null — 「意図的に何もない」ことを表す値。
  • undefined — 「まだセットされていない」値。
  • NaN0 / 0 のような無効な計算の結果。

この7つを覚えてください。あとは判定に迷う値が出てきたら、「この7つのどれかに当てはまる?」と自問するだけ。当てはまらなければ truthy です。

意外と truthy なやつら: "0"[]{}

ここで初心者はだいたいハマります。_見た目は_空っぽでも truthy な値はけっこうあるんです:

index.js
Output
Click Run to see the output here.

文字列が falsy になるのは、文字数がゼロのときだけです。"0" は1文字あるので truthy 扱いになります。配列とオブジェクトは、中身が空でも必ず truthy です。JavaScript ではこれらをオブジェクトとして扱い、オブジェクトは中身にかかわらずすべて truthy になるからです。

Python から来た人にとっては、ここが一番戸惑うポイントかもしれません。Python では []{} は falsy ですが、JavaScript では違います。

「空かどうか」を正しく判定する方法

[]{} は truthy なので、if にそのまま渡して空判定に使うことはできません。次のように明示的に書きましょう。

index.js
Output
Click Run to see the output here.

文字列の場合も、空白だけの文字列を「空」として扱いたいなら次のようにします。

index.js
Output
Click Run to see the output here.

Truthy / Falsy はあくまで便利な省略記法であって、「データにとって "空" とは何か」をきちんと考える作業の代わりにはなりません。

本物の Boolean に変換する

truthy っぽい値ではなく、本当の true / false が欲しい場面もあります。定番のイディオムは次の2つです。

index.js
Output
Click Run to see the output here.

Boolean(x) が明示的な真偽値への変換で、!!x はその短縮記法です。最初の ! で真偽値に変換しつつ反転させ、2つ目の ! でもう一度反転して元に戻す、という仕組みですね。どちらもよく使われます。!! の方が短く書けますが、Boolean() の方が意図は読み取りやすいです。

関数からきれいな真偽値を返したいときの return 文で、!! をよく見かけます。

index.js
Output
Click Run to see the output here.

&&|| における Truthy / Falsy

JavaScript の論理演算子は、実は truefalse を返しているわけではありません。オペランド(被演算子)のどちらか一方をそのまま返します。どちらが返ってくるかは、値の truthy / falsy によって決まります。

index.js
Output
Click Run to see the output here.

これが value || defaultValue というデフォルト値のイディオムが広く使われる理由です。ただし落とし穴もあります。このパターンは すべての falsy な値を同じように扱ってしまうので、0"" のように本来は有効な入力であるはずの値まで弾かれてしまうのです。

index.js
Output
Click Run to see the output here.

nullundefined のときだけフォールバックしたい場合は、代わりに Null 合体演算子 ?? を使いましょう。こちらについては別のドキュメントで詳しく解説しています。

チートシート

index.js
Output
Click Run to see the output here.

印刷してモニターに貼り付けたら、あとは気にせず次に進みましょう。

次は: イテレータとジェネレータ

条件分岐とループをひと通り押さえたので、次の章では JavaScript が値を「必要なときに生成する」仕組みを見ていきます。イテレータとジェネレータは、for...of やスプレッド構文、さらには最近の多くの API を支えている縁の下の力持ちです。次章でじっくり取り上げます。

よくある質問

JavaScriptでfalsyな値はどれですか?

falsyな値はちょうど7つだけです: false0-00n(BigIntのゼロ)、''(空文字列)、nullundefined、そして NaN。これ以外はすべてtruthyで、'0''false'[]{} も含めて全部truthy扱いです。このfalsyリストさえ覚えておけば、あとは消去法でどんな値でも判定できます。

空の配列 [] はtruthy? それともfalsy?

truthyです。if ([]) { ... } はブロックの中が実行されます。PythonやPHPから来た人が一番驚くポイントですね。配列もオブジェクトも、中身が空かどうかに関係なく常にtruthyになります。配列が空かどうかを判定したいなら、arr.length === 0 と明示的に書くのが正解です。

値をboolean型に変換するにはどうすればいい?

方法は2つ。明示的に書くなら Boolean(value)、短く書きたいときは !!value(否定を2回かけて元の真偽に戻すイディオム)です。どちらも同じtruthy/falsyのルールに従います。truthy判定だけで済ませず、実際の true / false の値が欲しいときに使ってください。

Coddyでコードを学ぼう

始める