== が意図しない型変換で真になってしまう(===との違い)
==は比較の前に両辺の型をそろえようとするため、文字列の"0"や空文字列、falseなどが数値の0と等しいと判定されてしまいます。===は型変換をしないため、この種の事故を避けられます。
なぜエラーが出ないのか
出力: true
(エラーなし)- JavaScriptは何も報告しません。文法として正しいためです
出力: true- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 function isEmpty(value) { 2 return value == ""; ^ 3 } 4 console.log(isEmpty(0));
==は比較の前に両辺の型をそろえるため、数値の0と空文字列""は等しいとみなされます。0は空文字列ではないので、型まで比較する===が必要です。
直し方: == を === にします。
パターン2
1 function isActive(status) { 2 return status == false; ^ 3 } 4 console.log(isActive("0"));
文字列"0"は空でも0でもない、れっきとした真の値ですが、==はfalseと比較する際に両辺を数値に変換するため一致してしまいます。
直し方: == を === にします。
パターン3
1 function isZero(input) { 2 return input == 0; ^ 3 } 4 console.log(isZero(""));
空文字列""は==で数値と比較されると0に変換されます。""と0は別の値なので、型まで確認する===で防げます。
直し方: == を === にします。
パターン4
1 function isNull(value) { 2 return value == null; ^ 3 } 4 console.log(isNull(undefined));
==はnullとundefinedを特別に等しいとみなします。型まで区別したい場合は===を使います。
直し方: == を === にします。
パターン5
1 function isFive(value) { 2 return value == 5; ^ 3 } 4 console.log(isFive(" 5 "));
前後に空白を含む文字列も、==では数値に変換されて一致してしまいます。===なら型が違うのでfalseになります。
直し方: == を === にします。
よくある誤解
「==のほうが柔軟だから安全」ではありません。==が起こす暗黙の型変換は直感に反する組み合わせで真になることが多く、意図をそのままコードに表せる===のほうが多くの場面で安全です。
実務での勘所
==の型変換規則は仕様上かなり複雑で、直感に反する結果を生みます。空配列は[] == falseがtrueになります(配列が空文字列""に変換され、falseも0に変換されて、最終的に"" == 0の比較になるため)。さらに[] == ![]もtrueになります(![]はfalseなので、これも同じ経路をたどります)。一方でnull == undefinedはtrueですが、null == 0はfalseです。nullは仕様上、undefinedとの比較でだけ特別扱いされ、他の値とは一切型変換されないためです。この不規則さこそが、実務でほぼ例外なく===が推奨される理由です。