== が意図しない型変換で真になってしまう(===との違い)
==は比較の前に両辺の型をそろえようとするため、文字列の"0"や空文字列、falseなどが数値の0と等しいと判定されてしまいます。===は型変換をしないため、この種の事故を避けられます。
なぜエラーが出ないのか
出力: true
(エラーなし)- JavaScriptは何も報告しません。文法として正しいためです
出力: true- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 function isEmpty(value) { 2 return value == ""; ^ 3 } 4 console.log(isEmpty(0));
出力: true期待: false (エラーにはなりません)
==は比較の前に両辺の型をそろえるため、数値の0と空文字列""は等しいとみなされます。0は空文字列ではないので、型まで比較する===が必要です。
直し方: == を === にします。
広告
広告スロット(未設定)
パターン2
1 function isActive(status) { 2 return status == false; ^ 3 } 4 console.log(isActive("0"));
出力: true期待: false (エラーにはなりません)
文字列"0"は空でも0でもない、れっきとした真の値ですが、==はfalseと比較する際に両辺を数値に変換するため一致してしまいます。
直し方: == を === にします。
パターン3
1 function isZero(input) { 2 return input == 0; ^ 3 } 4 console.log(isZero(""));
出力: true期待: false (エラーにはなりません)
空文字列""は==で数値と比較されると0に変換されます。""と0は別の値なので、型まで確認する===で防げます。
直し方: == を === にします。
よくある誤解
「==のほうが柔軟だから安全」ではありません。==が起こす暗黙の型変換は直感に反する組み合わせで真になることが多く、意図をそのままコードに表せる===のほうが多くの場面で安全です。
まとめ
== が意図しない型変換で真になってしまう(===との違い)は初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。