JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

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' == falsetrue== による型強制で、両辺が数値0に変換されて比較されるため
if ('0')true空でない文字列はtruthyとみなされるため
if (0)false数値0はfalsyとみなされるため

おわりに

このように、== 演算子による比較では型強制が行われる一方、if文などのブーリアンコンテキストでは値そのもののtruthy/falsy判定が行われます。この2つのルールの違いこそが、JavaScriptの一見不思議な挙動の正体です。

予期しないバグを防ぐためには、== ではなく === 演算子(厳密等価演算子)を使うこと、あるいはBoolean()関数で明示的に変換してから判定することが推奨されます。型変換が起こるタイミングを意識することが、JavaScriptを正しく使いこなすための第一歩となるでしょう。

  1. JavaScriptのdebuggerステートメントの使い方を徹底解説

    JavaScriptのdebuggerステートメントは、コード内にブレークポイントを設定するための構文です。実行中のコードがdebuggerステートメントに到達すると、その時点で処理が一時停止し、開発者ツールのデバッガーが利用可能であれば自動的にデバッガー機能が呼び出されます。 debuggerステートメントの基本動作 debuggerステートメントは、以下のような場面で特に役立ちます。 コードの特定の箇所で処理を止めて、変数の値を確認したいとき ループ処理の各ステップを詳細に追跡したいとき 複雑なロジックの不具合原因を特定したいとき なお、ブラウザの開発者ツール(DevTools)が開い

  2. JavaScriptでfalsy値(偽と評価される値)を見分ける方法

    JavaScriptにおけるfalsy値とはJavaScriptでは、値をBoolean型として評価したときに「false」とみなされる値がいくつか存在します。これらは「falsy値(偽の値)」と呼ばれます。条件分岐や論理演算において、意図しない動作を防ぐために、どの値がfalseと評価されるかを正しく理解しておくことが重要です。JavaScriptでfalseと評価される主な値は以下の通りです。false — Boolean型のfalseそのもの0 — 数値のゼロ空文字列:、、または ``(テンプレートリテラル)null — 値が存在しないことを示す特殊な値undefined — 値が未定義