2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScriptのif文に変数を直接突っ込むのは危険?他言語と比較して考える

Last updated at Posted at 2025-09-09

JavaScriptのif文に変数を直接突っ込むのは危険?他言語と比較して考える

はじめに

JavaScriptを書いていると、次のようなコードをよく目にします。

const arr = [];

if (case1) {
  arr.push("hoge");
}

if (case2) {
  arr.push("huga");
}

if (arr) {
  console.log("配列の要素は存在する");
}

一見すると、

「case1 と case2 がどちらも満たされない場合は、arr が空配列のままなので false になるのでは?」

と思いますよね。


ところが実際には、この if (arr)true と判定されます。

なぜなら、JavaScriptには暗黙の型変換があり、
配列やオブジェクトは「空であっても truthy」 と扱われるからです。


この記事では、

  • JavaScriptにおける暗黙の型変換の落とし穴
  • 空配列・空オブジェクト・空文字など直感的に分かりにくいケース
  • 他の言語(Python, PHP, Ruby)との比較
    を整理し、「可読性を重視して明示的に書きましょう」 という提案をします。

JavaScriptにおけるtruthy / falsy

JavaScriptでは、if (...) に渡された値が 真偽値へ暗黙的に変換 されます。

falsy として扱われる値

  • false
  • 0, -0, 0n
  • ""(空文字)
  • null
  • undefined
  • NaN

truthy として扱われる値

上記以外はすべてtruthyです。
例えば:

if ([]) console.log("空配列はtruthy"); // 出力される
if ({}) console.log("空オブジェクトもtruthy"); // 出力される
if ("0") console.log("文字列'0'もtruthy"); // 出力される

直感と異なるポイント

  • [] や {} が true 扱いになる
  • "0" は true 扱いになる(数値の 0 は false)

明示的に書いた方が良い例

意図を明確にするためには、次のように プロパティや長さを確認する条件式 を書くのがおすすめです。

// 悪い例(読み手が意図を誤解する可能性あり)
if (arr) { ... }

// 良い例
if (arr.length > 0) { ... }

if (obj && Object.keys(obj).length > 0) { ... }

if (str !== "") { ... }

これなら「空配列は除外したいんだな」「空文字を弾きたいんだな」と意図が読み取れます。

他言語との比較

言語 空配列   空オブジェクト/辞書 空文字   特徴
JavaScript true true false 空配列/空オブジェクトがtruthy
Python false false false 「空=false」が基本
PHP false false false Pythonに近い
Ruby true true true nilfalse以外はtruthy

Python

arr = []
if arr:
    print("空配列でもtrue")  # ← 出力されない

Pythonユーザーは「空ならFalse」と考えるので、JavaScriptとのギャップに戸惑いやすいです。

PHP

$arr = [];
if ($arr) {
    echo "true";
} else {
    echo "false"; // 出力される
}

こちらも「空ならfalse」が自然。

Ruby

arr = []
if arr
  puts "true" # 出力される
end

RubyはJavaScriptと似ており、「空配列はtrue」。ただし空文字もtrueなのでさらに独特。

まとめ

  • JavaScriptでは「空配列・空オブジェクト」がtruthyになるため、直感に反する挙動をすることがある
  • PythonやPHPでは「空はfalse」扱いが一般的で、JavaScriptに特有の落とし穴
  • RubyはJavaScriptに似ているが、空文字までtrue扱いになる点でさらに注意が必要
  • 読みやすさと意図の明確さを優先して、arr.length > 0 や Object.keys(obj).length > 0 など 明示的に条件を書くことを推奨

最後に

暗黙の型変換は便利ですが、他言語の習熟度が高い人は反対の理解をしてしまうケースがあり、メンテナンス性が下がる一面もあります。
「if文に変数を直接入れるのはやめよう」 を習慣化すると安全だと考えております。

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?