JavaScriptで「'0' == false」がtrueになるのに、「if(0)」はfalseになるのはなぜですか?
はじめに:一見矛盾するJavaScriptの挙動
JavaScriptを学んでいると、次のようなコードに出会って戸惑うことがあります。
if ('0' == false) {
console.log('実行される'); // true なので表示される
}
if ('0') {
console.log('実行される'); // これも true なので表示される
}
if (0) {
console.log('実行されない'); // false なので表示されない
}
「'0' == false」はtrue、つまり文字列'0'がfalseと「等しい」と評価される一方で、if文の中では同じ文字列'0'がtrueとして扱われます。逆に、数値の0はfalseとして扱われます。この一見矛盾した結果はどこから来るのでしょうか。条件を一つずつ見ていきましょう。
'0' == false がtrueになる理由:== 演算子による型強制
まず「if ('0' == false)」から確認します。この比較には、ECMAScriptの仕様にある次のルールが適用されます。
If Type(y) is Boolean,
return the result of the comparison x == ToNumber(y)
これは「比較対象の片方がブーリアン型である場合、それを数値に変換してから比較せよ」という意味です。== 演算子(疎等価演算子)は暗黙の型変換、いわゆる型強制(type coercion)を行います。そのため、左辺の文字列'0'は数値0に変換され、右辺のfalseも数値0に変換されます。結果として「0 == 0」という数値同士の比較になり、trueが返るのです。
ここで重要なのは、比較が行われる時点ですでに型変換が完了しているという点です。つまり、この結果は文字列'0'自体がtruthy(真とみなされる)かfalsy(偽とみなされる)かを示すものではありません。比較の前に'0'は数値へ変換されてしまうため、文字列としての性質は評価に関与しないのです。
if ('0') と if (0):truthy / falsy の判定ルール
次にif文の条件式です。if文では、== 演算子のような型強制は一切行われません。代わりに、渡された値そのものがtruthyかfalsyかによって分岐が決まります。
JavaScriptにおいてfalsyとみなされるのは、次の値だけです。
- false
- 0、-0、0n(BigIntのゼロ)
- 空文字列 ''
- null
- undefined
- NaN
これ以外のすべての値はtruthyです。したがって、次のように判定されます。
- if ('0') … 文字列'0'は空ではないためtruthy → 条件はtrue
- if (0) … 数値0はfalsy → 条件はfalse
if文の中では「空でない文字列は常にtrue」と覚えておくとよいでしょう。文字列はそれ自体の性質だけで真偽評価できるため、この場合に型強制は発生しません。また、if (0) がfalseになるのは、0という数値自体がfalsyだからです。
結果のまとめ
| 式 | 結果 | 理由 |
|---|---|---|
| '0' == false | true | == による型強制で、両辺が数値0に変換されて比較されるため |
| if ('0') | true | 空でない文字列はtruthyとみなされるため |
| if (0) | false | 数値0はfalsyとみなされるため |
おわりに
このように、== 演算子による比較では型強制が行われる一方、if文などのブーリアンコンテキストでは値そのもののtruthy/falsy判定が行われます。この2つのルールの違いこそが、JavaScriptの一見不思議な挙動の正体です。
予期しないバグを防ぐためには、== ではなく === 演算子(厳密等価演算子)を使うこと、あるいはBoolean()関数で明示的に変換してから判定することが推奨されます。型変換が起こるタイミングを意識することが、JavaScriptを正しく使いこなすための第一歩となるでしょう。
-
JavaScriptのdebuggerステートメントの使い方を徹底解説
JavaScriptのdebuggerステートメントは、コード内にブレークポイントを設定するための構文です。実行中のコードがdebuggerステートメントに到達すると、その時点で処理が一時停止し、開発者ツールのデバッガーが利用可能であれば自動的にデバッガー機能が呼び出されます。 debuggerステートメントの基本動作 debuggerステートメントは、以下のような場面で特に役立ちます。 コードの特定の箇所で処理を止めて、変数の値を確認したいとき ループ処理の各ステップを詳細に追跡したいとき 複雑なロジックの不具合原因を特定したいとき なお、ブラウザの開発者ツール(DevTools)が開い
-
JavaScriptでfalsy値(偽と評価される値)を見分ける方法
JavaScriptにおけるfalsy値とはJavaScriptでは、値をBoolean型として評価したときに「false」とみなされる値がいくつか存在します。これらは「falsy値(偽の値)」と呼ばれます。条件分岐や論理演算において、意図しない動作を防ぐために、どの値がfalseと評価されるかを正しく理解しておくことが重要です。JavaScriptでfalseと評価される主な値は以下の通りです。false — Boolean型のfalseそのもの0 — 数値のゼロ空文字列:、、または ``(テンプレートリテラル)null — 値が存在しないことを示す特殊な値undefined — 値が未定義