Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

数値に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'