今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

NaNかどうかを判断するにはisNaN()を使う

JavaScriptだと基本的なことなんだろうけど、10分くらい悩んだのでメモ。

テキストファイルから位置情報を読み込んでほげほげするプログラムを作ってた。読み込んだ文字列が数値じゃない場合には処理を分ける必要があるので、こんなプログラムを書いた。

function isLatLng(latitude, longitude) {
    var lat = parseFloat(latitude);
    var lng = parseFloat(longitude);
    if (lat == NaN || lng == NaN) return false; 
    if (lat < -90 || lat > 90) return false
    if (lng < -180 || lng > 180) return false;
    return true;
}

なぜか空文字列でも false にならない。

function isLatLng(latitude, longitude) {
    var lat = parseFloat(latitude);
    var lng = parseFloat(longitude);
    console.log('lat=' + lat + ', lng=' + lng);
    if (lat == NaN || lng == NaN) return false; 
    if (lat < -90 || lat > 90) return false
    if (lng < -180 || lng > 180) return false;
    return true;
}

出力結果

lat=NaN, lng=NaN

コンソールに出力してみたら、しっかり NaN が入ってるし。

ぐぐってみたら、NaN は、== で比較しちゃいかんと。考えてみればそのとおりで、NaN って数値としては固定の値ではないから NaN と NaN は一般的には異なる値だ。

NaNかどうかを判断するには、isNaN() を使わないといけなかった。
というわけで、以下のコードが正解。

function isLatLng(latitude, longitude) {
    var lat = parseFloat(latitude);
    var lng = parseFloat(longitude);
    if (isNaN(lat) || isNaN(lng)) return false; 
    if (lat < -90 || lat > 90) return false
    if (lng < -180 || lng > 180) return false;
    return true;
}