
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/ |
