Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

数値にNaNを足すとNaNになる

数値にNaNを足すとNaNになります。

実際のところ

グローバル変数NaNは"Not-A-Number"の略で、数値でない事を示す変数です。
数値を吐き出すメソッドでミスった場合に出力されます。

Math.sqrt(-1)
// NaN

このNaN、一つ奇妙な特性があり……既存の数値に足し込むと、巻き添えを喰らってNaNになります

var a = 1
a += NaN
console.log(a) 
// => NaN

これはfalseやnullでは発生しない現象です。

console.log(7 + false)
// 7

console.log(7 + null)
// 7

console.log(7 + NaN)
// NaN

これを回避するには、足し込む前にパースするなりの対策が必要です。
javascriptではRubyと同様に正オブジェクトの否定の否定はTrueです。
更にNaNは否定するとTrueになります。
これらを活かして、以下のようにしました。

var a = 1
var result = NaN
a += (!!result) ? (result) : (0)
console.log(a)
// 1

補足

NaNを文字列に加算すると、数値として認識され"NaN"とパースされます。
この場合にも、数値の計算時と同様何らかの対策が必要でしょう。

"hoge" + NaN
// 'hogeNaN'