====== JavaScript Numberオブジェクト ====== --- //[[http://www.y2sunlight.com/water|y2sunlight]] 2021-07-26// [[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number|Numberオブジェクト]]は数値型( number )を扱うためのラッパーオブジェクトです。 ===== NaNとInfinity ===== JavaScriptでは、以下の特殊な数値を Numberオブジェクトのプロパティが保持しています。 * NaN ・・・ ゼロをゼロで割った場合などの未定義な演算結果を表す値 * Infinity ・・・ 浮動小数点数が表現可能な最大値を超えた場合の値 ECMA標準では、これらの特殊な値はグローバル変数 ([[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/NaN|NaN]] と [[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Infinity|Infinity]]) としても定義されていますが、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オブジェクトを返しますが、あまり使用されることはなく、[[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number|Number()]] 関数の方が良く使用されます。 let number = Number(1); console.log(typeof(number)); // number 両者の違いは、Numberオブジェクトを返すか、基本データ型( number )を返すかの違いであり、厳密には異なりますが、実務上それは意識する必要がほとんどありません。 \\ ===== 静的プロパティ ===== 詳しくは[[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number#static_properties|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オブジェクトの静的メソッドの使用例を示します。詳しくは[[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number#static_methods|MDN]]をご覧下さい。 ==== isNaN() ==== Number.isNaN(value) 引数が NaN(Not a Number)且つ number型の場合、true を返します。NaN については[[#NaNとInfinity|前の項]]を参照して下さい。 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() 以外にグローバル関数の [[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/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)については[[#NaNと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() 以外にグローバル関数の [[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/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オブジェクトのインスタンスメソッドの使用例を示します。詳しくは[[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number#instance_methods|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を返す)。入力時のバリデーションに対してはいずれの方法を使用してもバリデーションできると思います。 \\