2009年2月5日 木曜日 21:28:52

javascriptでNaNを判定してみる

WEB開発,javascript,メモ [ by Mizugame ]

javascriptでNaNを判定したい
javascriptでparseIntやparseFloatなんかで文字列型を数値に変換したりするんですが、ちょっとNaNが来たときなんかは判定があやしくなっちゃうんですよね。

例えば

alert(parseInt('a') ? 'Number' : 'NaN');

みたいな安直なことはできないわけですよ。

alert(parseInt('0') ? 'Number' : 'NaN');

みたいに文字列が「0」の場合、ちゃんと0が返ってきてもNaN判定になっちゃうから。

ググっても「NaN」そのものを判定するのが見つからなかったので、正常にNaNを判定する方法を考えてみた。
・・・検索が下手なだけかもしれないどヽ(´ー`)┌

Number.NaNを判定

javascript:alert(parseInt('a').toString() == 'NaN');

なんだかパースしながら、さらに文字列に戻しちゃうわけですが(>▽<);;;
遠まわしだけど、今のとこ思いつく確実な方法。

alert(parseInt('a') == NaN);

とか

alert(parseInt('a') == Number.NaN);

でいけるかなとか思ってたんだけど、どうも偽が返ってきちゃったので。

もっといい方法を知ってる人がいたら、ぜひ教えてください。

ともかくNaNを文字列に戻すと空になるかなと思ったけど、NaNって文字が返ってくるんだね。

ちょこっと追記

関数として使うなら
※isNaNって関数がそもそも存在するみたいなのでis_NaNに微変更

function is_NaN($value)
{
  return (typeof $value == 'number' && $value.toString() == 'NaN');
}

alert(is_NaN(1)); //false
alert(is_NaN('a')); //false
alert(is_NaN(parseInt('a'))); //true

ってとこだろうか。

さらに追記

いろいろやってたら、そもそもisNaNって関数があるみたい( ̄□ ̄;
で、全くの無駄記事になるかと思ったら・・・(>_<);;;

alert(isNaN(NaN)); //true (これはOK)
alert(isNaN(1)); //false (これもOK)
alert(isNaN(Infinity)); //false (OK)
alert(isNaN(undefined)); //true (あれ?)
alert(isNaN('text')); //true (あれれ?)
alert(isNaN('')); //false (OK)
alert(isNaN('1')); //false (これもOKだけど、キャストされてる?)
alert(isNaN('Infinity')) //false (これもキャストされてる?)

ダメじゃん。

isNaNだとundefinedとかまでNaNと判定されるらしい。
なんか基準もよくわからないし。

やっぱ正確にはnumber型でかつ文字列に変換後にNaNとなるものを判定するのがいいみたい。
まぁ、勉強になりました(>_<);;;

関連記事:
JavascriptでindexOfとmatchの速度がちょっと気になった
[MDIEスクリプト] select2zip.jsを更新
[clipFolder.js] MDIEでクリップボードからサクッとフォルダを作成

コメント (2) »

1. 『J』
コメント :: 2010年2月17日 水曜日 @ 122:06:13

参考になりました!ありがとうございます!

NaNって「Not a Number」だと思うので,数字じゃないものに対してtureを返すと思います.

が最後の二つでfalseが返ってくるのはよくわかんないですね.

2. Mizugame
コメント :: 2010年2月22日 月曜日 @ 21:07:02

参考になったようで何よりです。
最近、放置気味だったため返信つけるのがすっかり遅くなってしましました(>_<)

>が最後の二つでfalseが返ってくるのはよくわかんないですね.
やっぱりisNaN自体は共同を見る限り、渡された値を数値にキャストしてから判断しているようですね(>_<)

alert(parseFloat('Infinity')); //1(数値)
alert(parseFloat('Infinity')); //Infinity

この結果と比較すれば納得いく判定になるので。
もちろん期待してるものとは違いますが^^;

ただし、parseIntでキャストした場合は’Infinity’に関してはNaNになるんですよねw

奥(謎?)が深いです(*´▽`*)