LoginSignup
23
22

More than 5 years have passed since last update.

[JavaScript] isNaN() の謎な挙動とその対策

Last updated at Posted at 2014-06-17

グローバルで定義されている isNaN()
謎の挙動をするので再定義するコード書いた.

サンプル

isNaN() の謎な挙動

これ

console.log(isNaN(NaN));            // true
console.log(isNaN(5));              // false
console.log(isNaN(true));           // false
console.log(isNaN('NaN'));          // true
console.log(isNaN({a:100}));        // true

いやいや下の2つw
そっちのほうが便利な場合もあるのは分かるんですが...

isNaN() 謎挙動の理由

引数が暗黙的に数値に型変換してそれが NaN に変換されちゃって true
帰ってきてるのだと思われる.

isNaN() 謎挙動への対策

感覚的には NaN のときだけ NaN を返して欲しい!

って調べてたら ECMAScript6 では Number.isNaN() ってやつが定義されてて
これだとちゃんと NaN のときだけ true を返すようになってました.

ただ, Mobile Safari とかだとまだサポートされてなかったりするので
存在チェックして, 定義されていなければ自前で Number.isNaN()
実装するコードを書いてみました.

if (!Number.isNaN) {
    Object.defineProperty(Number, "isNaN", {
        value: function(n) {
            return n !== n;
        }
    });
}

NaN === NaNfalse になるってやつを利用してます.

ちなみにこれ使って結果はこんな感じ.

console.log(Number.isNaN(NaN));         // true
console.log(Number.isNaN(5));           // false
console.log(Number.isNaN(true));        // false
console.log(Number.isNaN('NaN'));       // false
console.log(Number.isNaN({a:100}));     // false

使う場面ってそんなにないんですけどね♪

23
22
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
22