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 |
nilとfalse以外は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文に変数を直接入れるのはやめよう」 を習慣化すると安全だと考えております。