グローバルで定義されている 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 === NaN
は false
になるってやつを利用してます.
ちなみにこれ使って結果はこんな感じ.
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
使う場面ってそんなにないんですけどね♪