2009年2月5日 木曜日 21:28:52
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でクリップボードからサクッとフォルダを作成
トラックバック URL :
コメント (2)