Math.abs()はNaNを返すことがある
JavaScriptで絶対値を取得したいときにMath.abs()が使用されることがあるがMath.abs()は数値でない場合NaNなどを返すことがある。
以下は各値にMath.abs()を使用した際の結果を一覧にしたものだ。
value | result |
---|---|
undefined | NaN |
false | 0 |
true | 1 |
null | 0 |
{} | NaN |
[] | 0 |
0 | 0 |
1 | 1 |
-1 | 1 |
empty | 0 |
'foo' | NaN |
-Infinity | Infinity |
NaN | NaN |
/reg/ | NaN |
このように数値以外だとほとんどがNaNを返し、booleanは0や1を返しているため使い方によってはバグの原因になることがある。
絶対値を返す関数を作成
対策として絶対値を返す関数を作成して使用する方法がある。
この場合、数値の-2および文字列の'-2'などは2を返し、それ以外はNaNを返さなくなる。
文字列の'-2'を絶対値にしたくない場合はtypeof==='number'を追加しておく。
function abs(val) { return val < 0 ? -val : val; }; console.log(abs(-2)); // 2 console.log(abs('-2')); // 2 console.log(abs('foo')); // 'foo'
value | result |
---|---|
undefined | undefined |
false | false |
true | true |
null | null |
0 | 0 |
1 | 1 |
-1 | 1 |
'-2' | 2 |
foo | foo |
-Infinity | Infinity |
NaN | NaN |
/reg/ | /reg/ |