NaNを===やswitchで判定できない理由と直し方
NaNはIEEE 754の仕様上、自分自身とも等しくないため、===はもちろん==でも決してtrueになりません。数値変換の失敗をチェックする際にこの性質を知らないと、判定が常にすり抜けます。
なぜエラーが出ないのか
出力: true
(エラーなし)- JavaScriptは何も報告しません。文法として正しいためです
出力: true- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 function isValidAge(input) { 2 const age = Number(input); 3 return !(age === NaN ); ^ 4 } 5 console.log(isValidAge("abc"));
出力: true期待: false (エラーにはなりません)
NaNはどんな値(自分自身も含む)と比較してもfalseになります。存在チェックにはNumber.isNaN()という専用の関数が必要です。
直し方: age === NaN を Number.isNaN(age) にします。
広告
広告スロット(未設定)
パターン2
1 function isNumeric(input) { 2 const n = parseFloat(input); 3 return !(n === NaN ); ^ 4 } 5 console.log(isNumeric("abc"));
出力: true期待: false (エラーにはなりません)
parseFloatが変換に失敗するとNaNを返しますが、=== NaNでの判定は常にfalseになるため、失敗を検出できません。
直し方: n === NaN を Number.isNaN(n) にします。
パターン3
1 function isDivisible(a, b) { 2 const result = a % b; 3 return !(result === NaN ); ^ 4 } 5 console.log(isDivisible(5, 0));
出力: true期待: false (エラーにはなりません)
0による剰余演算はNaNになります。=== NaNでは検出できず、割り切れると誤判定してしまいます。
直し方: result === NaN を Number.isNaN(result) にします。
よくある誤解
「NaNはNaNと等しいはず」という直感に反し、NaN === NaNは常にfalseです。存在確認にはNumber.isNaN()という専用の関数を使う必要があります。
まとめ
NaNを===やswitchで判定できない理由と直し方は中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。