【入門編】 論理演算におけるTruthy/Falsyの誤解 – JavaScript実践ガイド

こんにちは!フロントエンドの現場を渡り歩いてきたチーフアーキテクトの私です。

JavaScriptを書き始めて少し慣れてくると、避けて通れないのが「条件分岐(`if`文)」や「論理演算子(`&&` や `||`)」ですよね。
「あれ? 今ちゃんと動いたからいいか……」と見過ごしがちなこの挙動、実は多くのJavaScript学習者が最初にぶつかる「大きな壁」の一つなんです。

特に、「えっ、これ本当は空っぽなのに、中身がある判定になっちゃうの!?」という罠。
今回は、このTruthy(真っぽい値)とFalsy(偽っぽい値)の迷宮を、難しい専門用語をできるだけ抜いて、身近な例えを交えながら一緒に解き明かしていきましょう。

大丈夫です、誰もが最初に通る道ですから、ゆっくりリラックスして読んでいってくださいね。

—

そもそも「Truthy」と「Falsy」ってなに?

JavaScriptの世界には、見た目はBoolean(`true`や`false`)の形をしていないのに、`if`文などの条件式に放り込まれると、「勝手に `true` か `false` に脳内変換されちゃう値たち」が存在します。

これが、Truthy(トゥルーシー:真っぽい値) と Falsy(ファルシー:偽っぽい値) です。

イメージとしては、自動改札機を思い浮かべてみてください。
改札機(`if`文)は、パスケースに何が入っていようと、最終的には「通れ!(`true`)」か「止まれ!(`false`)」の二者択一で判断を下しますよね。この「ざっくりとした判定基準」こそが、暗黙の型変換の正体です。

まずは安心の「Falsy(偽っぽい値)」の仲間たち

JavaScriptにおいて、「こいつらは問答無用で `false` 扱いにする!」と決められているメンバーは、実はたったのこれだけです。数は多くありません。

1. `false` (そのまんま偽)
2. `0` (数字のゼロ)
3. `-0` (マイナスのゼロ)
4. `0n` (BigIntのゼロ)
5. `””` または `”` または “ “ (空っぽの文字列)
6. `null` (「中身が空っぽです」という明示的な不在)
7. `undefined` (「まだ値が定義されていません」という不在)
8. `NaN` (Not-a-Number:数字じゃないよエラー)

これら以外の値は、すべて「Truthy(真っぽい値)」として扱われます。
そう、ここが今回の最大のハイライトであり、魔境の入口です。

—

【最大の罠】「空っぽ」なのにTruthy!?

さて、ここからが本題です。
JavaScriptを書いていて、誰もが一度は「嘘でしょ……」と頭を抱える瞬間があります。それが、「空の配列 `[]`」や「空のオブジェクト `{}`」の存在です。

身近な例えでお買い物にたとえてみましょう

ここに、2つの「お買い物カゴ」があると想像してください。

  • カゴA:完全に何も入っていない、新品のプラスチック製カゴ
  • カゴB:レジを通してお会計が終わった、中身が空っぽの買い物袋

常識的に考えれば、どちらも「中身は入っていない(空っぽ)」ですよね。
しかし、JavaScriptくんの脳内では、こう処理されます。

  • カゴA(空の文字列 `””`):「中身なし! 通行止め!」(Falsy)
  • カゴB(空の配列 `[]` や空のオブジェクト `{}`):「おっ、カゴという『器(存在)』自体はそこにあるな!よし、Truthy(真)だ!」

なんと、JavaScriptは「中身の有無」ではなく、「そのデータ構造(オブジェクト)の存在そのもの」を検知してしまっているのです。これが、初心者を混乱させる最大の原因です。

実際にコードで見てみましょう

エディタを開いて、次のようなコードを試してみてください。

// 空の配列を用意します
const emptyArray = [];

// 「おっ、配列という箱が存在するから、if文の中に入るぞ!」
if (emptyArray) {
console.log(“やったぜ!空配列はTruthyだ!”); // ← こちらが実行されてしまいます
} else {
console.log(“空っぽだからfalseだね”);
}

// 空のオブジェクトを用意します
const emptyObject = {};

if (emptyObject) {
console.log(“本当は空っぽなのに、オブジェクトもTruthyだ!”); // ← これも実行されます
}

「ええーっ、空っぽなのに `if`文を通っちゃうの!?」と驚きませんでしたか?
私は初めてこれを知ったとき、思わずコーヒーを吹き出しそうになりました。でも、JavaScriptの仕様上、オブジェクトや配列は「存在している」だけで強烈なTruthyパワーを放つんです。

—

実務でやりがちな「やっちまった」コードと対策

Web制作の現場(例えば、APIから取得したデータが空かどうかチェックしたいときなど)で、この仕様を知らないと、思わぬバグを生んでしまいます。

❌ やりがちな危険な判定

const userData = []; // サーバーから返ってきたけど、ユーザーデータが空だった

// 「データがあるかチェックしたい!」と思ってこう書くと…
if (userData) {
console.log(“ユーザーデータを描画します!”); // データが無いのにこっちに入っちゃう!
// 画面がバグる、またはエラーで爆発する
}

⭕ 正しい安全な判定方法

「空っぽかどうか」を正確に判定したい場合は、JavaScriptくんに頼りきりになるのではなく、人間側から明確な条件を与えてあげましょう。

配列の場合は、`.length`(要素の数)を調べるのが鉄則です。

const userData = [];

// 配列の要素数が「0より大きいか」を厳密にチェックする!
if (userData.length > 0) {
console.log(“ユーザーデータが存在します”);
} else {
console.log(“おっと、データは空っぽです!安全にスルーします。”); // こっちを通るので安全!
}

オブジェクト(`{}`)の場合は、`.length`が使えないので、ちょっとしたテクニック(`Object.keys()`など)を使います。

const userSettings = {};

// オブジェクトの「キーの数」が0より大きいかチェックする
if (Object.keys(userSettings).length > 0) {
console.log(“設定項目があります”);
} else {
console.log(“設定オブジェクトは空っぽです!”); // 安全!
}

—

まとめ:JavaScriptくんと上手に付き合うために

いかがでしたでしょうか?
「空っぽなのにTruthyになる」という仕様は、最初は意地悪な仕様に思えるかもしれません。しかし、JavaScriptの歴史や設計思想を知ると、「オブジェクトという『箱』の存在をベースに判定しているんだな」と納得できるようになります。

  • 数字の `0` や空文字 `””` は容赦なく `false` (Falsy)
  • でも、空の配列 `[]` や空のオブジェクト `{}` は元気に `true` (Truthy)
  • 空っぽの判定をしたいときは、`.length` や `Object.keys()` で数(かず)を数えよう!

このポイントさえ頭の片隅に置いておけば、もう予期せぬバグに頭を悩ませることはありません。
フロントエンドの道は一歩一歩の積み重ねです。今日得た知見を武器に、また明日からのコーディングを楽しんでいきましょう! あなたのエンジニアライフを、チーフアーキテクトとして応援しています。

コメント

タイトルとURLをコピーしました