By

(JavaScript)isNaNメソッドの挙動の違い

ビジネスバンクグループ エンジニア の高橋 慶太です。

今回は、開発時に「えっ!?」と思った「isNaN」メソッドの挙動について、書いてみました。

isNaNメソッドとは?

isNaNメソッドは、名前の通り、NaN(Not a number)かどうかを判定するメソッドです。

JavaScriptにおいて、NaNかどうかを判定する場合にいくつか方法がありますが、記述の方法によって期待値が異なる場合があるため、どういう実行結果になるのかを把握した上で使う必要があります!

比較

今回は以下の3つの記述方法を比較してみました。

  • isNum(value)
  • Number.isNum(value)
  • _.isNaN(value) ※ Underscore.jsライブラリ

メソッド
引数 isNaN(value) Number.isNaN(value) _.isNaN(value)
NaN true true true
Number.NaN true true true
0/0 true true true
"NaN" true false false
undefined true false false
{} true false false
new Date().toString() true false false
new Date() false false false
[] false false false
1/0 false false false
true false false false
null false false false
123 false false false
123.45 false false false
"123" false false false
"123.45" false false false
"" false false false
" " false false false

一部違う結果が異なるところがありますね・・・。

なぜ結果が違う??

Number.isNaN()・_.isNaN()は、純粋に「引数がNaNかどうか」で判定されます。

しかし、isNaN()の場合は、引数を暗黙的に変換してしまって、「NaNに変換できてしまうものはNaNである」と判定されてしまうようです。

まとめ

記述方法によっては、期待しない結果が返ってくる場合があるので、気をつけて使いましょう!

エンジニア募集中!

ビジネスバンクグループではエンジニアを募集中しています。

弊社が採用しているテクノロジや開発環境に興味を持った方は、 ここから是非エントリー を!

高橋 慶太
Software Engineer