目次

JavaScript Numberオブジェクト

y2sunlight 2021-07-26

Numberオブジェクトは数値型( number )を扱うためのラッパーオブジェクトです。

NaNとInfinity

JavaScriptでは、以下の特殊な数値を Numberオブジェクトのプロパティが保持しています。

ECMA標準では、これらの特殊な値はグローバル変数 (NaNInfinity) としても定義されていますが、Numberオブジェクトの静的プロパティでも同じ値が保持されています。

NaN に対する演算は、特殊な振舞いをします。NaN を含むどんな演算もその結果は NaN になります。例えば、NaN + 1 は NaN になり、NaN == 1 は false になります。最も混乱させるのは、NaN == NaN の結果が false になるということです。従って、NaN には比較演算子を適用することが出来ません。この理由から、NaN を判定する特別な関数 isNaN() が提供されています。


Number()関数

Numberオブジェクトはコンストラクタによって以下の様に生成されます。

let number = new Number(1);
console.log(typeof(number)); // object

このコンストラクタは Numberオブジェクトを返しますが、あまり使用されることはなく、Number() 関数の方が良く使用されます。

let number = Number(1);
console.log(typeof(number)); // number

両者の違いは、Numberオブジェクトを返すか、基本データ型( number )を返すかの違いであり、厳密には異なりますが、実務上それは意識する必要がほとんどありません。


静的プロパティ

詳しくはMDNをご覧下さい。

メンバー概要
Number.EPSILON計算機 ε(イプシロン)と呼ばれる1より大きい最小の数と1との差
Number.MIN_VALUE正の数の最小値
Number.MAX_VALUE正の数の最大値
Number.MIN_SAFE_INTEGER整数の最小値 -(253 - 1)
Number.MAX_SAFE_INTEGER整数の最大値 253 - 1
Number.NaN非数(Not a Number)の値
Number.NEGATIVE_INFINITY負の最大値を表す値(オーバーフロー時に返されます)
Number.POSITIVE_INFINITY正の最大値を表す値(オーバーフロー時に返されます)


静的メソッド

以下に主な Numberオブジェクトの静的メソッドの使用例を示します。詳しくはMDNをご覧下さい。

isNaN()

Number.isNaN(value)

引数が NaN(Not a Number)且つ number型の場合、true を返します。NaN については前の項を参照して下さい。

var x = 123;
var ret = Number.isNaN(x);
console.log(ret);  // false

var x = 1.23;
var ret = Number.isNaN(x);
console.log(ret);  // false

var x = '123';
var ret = Number.isNaN(x);
console.log(ret);  // false

var x = 'abc';
var ret = Number.isNaN(x);
console.log(ret);  // false (NaN 且つ 非number型)

var x = 1 / 0;
var ret = Number.isNaN(x);
console.log(ret);  // false (Infinity)

var x = 0 / 0;
var ret = Number.isNaN(x);
console.log(ret);  // true (NaN 且つ number型)

Number.isNaN() 以外にグローバル関数の isNaN() もあります。この関数は引数が NaN のみを判定し、引数のデータ型には依存しません。

console.log(isNaN(123));    // false
console.log(isNaN(1.23));   // false
console.log(isNaN('123'));  // false
console.log(isNaN('abc'));  // true (NaN 且つ 非number型)
console.log(isNaN(1/0));    // false (Infinity)
console.log(isNaN(0/0));    // true (NaN 且つ number型)


isFinite()

Number.isFinite(value)

引数が有限数( finity )の場合、true を返します。有限数でない値(infinity)については前の項を参照して下さい。

var x = 123;
var ret = Number.isFinite(x);
console.log(ret);  // true

var x = 1.23;
var ret = Number.isFinite(x);
console.log(ret);  // true

var x = '123';
var ret = Number.isFinite(x);
console.log(ret);  // false (非number型)

var x = 'abc';
var ret = Number.isFinite(x);
console.log(ret);  // false (非number型)

var x = 1 / 0;
var ret = Number.isFinite(x);
console.log(ret);  // false (Infinity)

var x = 0 / 0;
var ret = Number.isFinite(x);
console.log(ret);  // false (NaN)

Number.isFinite() 以外にグローバル関数の isFinite() もあります。


isInteger()

Number.isInteger(value)

引数が整数の場合、true を返します。

var x = 123;
var ret = Number.isInteger(x);
console.log(ret);  // true

var x = 1.23;
var ret = Number.isInteger(x);
console.log(ret);  // false

var x = '123';
var ret = Number.isInteger(x);
console.log(ret);  // false (非number型)

var x = 'abc';
var ret = Number.isInteger(x);
console.log(ret);  // false (非number型)

var x = 1 / 0;
var ret = Number.isInteger(x);
console.log(ret);  // false (Infinity)

var x = 0 / 0;
var ret = Number.isInteger(x);
console.log(ret);  // false (NaN)


parseFloat()

Number.parseFloat(string)

引数の文字列を浮動小数点数( float )に変換します。グローバル関数の parseFloat と同じです。

var x = 2;
var ret = Number.parseFloat(x) * 2.0 * 3.14;
console.log(ret);  // 12.56

var x = 2;
var ret = parseFloat(x) * 2.0 * 3.14;
console.log(ret);  // 12.56


parseInt()

Number.parseInt(string,[ radix])

引数の文字列を指定された基数の整数に変換します。

var x = 10;
var ret = Number.parseInt(x, 2);    // 2進数を10進数へ変換
console.log(ret);  // 2

var x = 10;
var ret = Number.parseInt(x, 8);    // 8進数を10進数へ変換
console.log(ret);  // 8

var x = 10;
var ret = Number.parseInt(x, 16);   // 16進数を10進数へ変換
console.log(ret);  // 16

var x = '123';
var ret = Number.parseInt(x, 10);   // 10進数の文字列をを整数に変換
console.log(ret);  // 123

var x = 12.3;
var ret = Number.parseInt(x, 10);   // 浮動小数点数から整数に変換
console.log(ret);  // 12

var x = 'abc';
var ret = Number.parseInt(x, 10);   // 文字は整数に変換できない
console.log(ret);  // NaN

上の例はグローバル関数 parseInt を使用した場合でも同様になります。

var x = 10;
var ret = parseInt(x, 2);
console.log(ret);  // 2


インスタンスメソッド

以下に主な Numberオブジェクトのインスタンスメソッドの使用例を示します。詳しくはMDNをご覧下さい。

toString()

numObj.toString([radix])

Numberオブジェクトを文字列に変換します。

var x = new Number(123);
var ret = x.toString();
console.log(ret);  // 123

var x = new Number(1.23);
var ret = x.toString();
console.log(ret);  // 1.23

var x = new Number(1 / 0);
var ret = x.toString();
console.log(ret);  // Infinity

var x = new Number(0 / 0);
var ret = x.toString();
console.log(ret);  // NaN


toLocaleString()

numObj.toLocaleString([locales [, options]])

Numberオブジェクトをロケールに応じた形式に変換します。JavaScriptで数値をカンマ編集したい場合は、このメソッドが利用出来ます。

var x = new Number(1234.56);
var ret = x.toLocaleString();
console.log(ret);  // 1,234.56


toFixed()

numObj.toFixed([digits])

Numberオブジェクトを指定された固定小数点表記に変換します。

var x = new Number(1234.56);
var ret = x.toFixed(3);
console.log(ret);  // 1234.560


toPrecision()

numObj.toPrecision([precision])

Numberオブジェクトを指定された精度の文字列に変換します。

var x = new Number(1234.56);
var ret = x.toPrecision(5);
console.log(ret);  // 1234.6


toExponential()

numObj.toExponential([fractionDigits])

Numberオブジェクトを指定された指定表記に変換します。

var x = new Number(1234.56);
var ret = x.toExponential(2);
console.log(ret);  // 1.23e+3


valueOf()

numObj.valueOf()

Numberオブジェクトのプリミティブ値を返します。

var x = new Number(1234.56);
var ret = x.valueOf();
console.log(ret);  // 1234.56


数値のバリデーション方法

入力された値または計算結果が数値であるか否かを判定(バリデーション)する場合は isNaN()またはisFinite()を使用した様々な方法がありますが、当サイトでは以下のisFinite()を使った方法で数値のバリデーションを行うことを推奨します。

var x = 123;
var ret = Number.isFinite(Number(x));
console.log(ret);  // true

var x = 1.23;
var ret = Number.isFinite(Number(x));
console.log(ret);  // true

var x = '123';
var ret = Number.isFinite(Number(x));
console.log(ret);  // true

var x = 'abc';
var ret = Number.isFinite(Number(x));
console.log(ret);  // false (NaN)

var x = 1 / 0;
var ret = Number.isFinite(Number(x));
console.log(ret);  // false (Infinity)

var x = 0 / 0;
var ret = Number.isFinite(Number(x));
console.log(ret);  // false (NaN)

isNaN()を使った方法では 1 / 0 の判定ができません(isNaN()はtrueを返す)。入力時のバリデーションに対してはいずれの方法を使用してもバリデーションできると思います。