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

コメント