数値の値は、次のように一連の数字で構成されます。
5
数値データ型には、Infinity
や NaN
など、数値の概念を表す特別なグローバル プロパティも含まれています。これは「数値ではない」という意味で、数値以外の値に対して算術計算を実行しようとした場合に起こり得る結果です。
数値オブジェクト
値が Number()
関数に渡されると、その値は同等の数値に変換されます。たとえば、数値文字列は同等の数値プリミティブになります。
Number( "10" );
> 10
false
または null
の値を Number()
に渡すと 0
が返され、true
は 1
を返します。
Number( null );
> 0
Number( false );
> 0
Number( true );
> 1`
undefined
や数字以外の文字を含む文字列など、値を変換できない場合、Number
関数は NaN
を返します。
Number( undefined );
> NaN
Number( "The number 3." );
> NaN
プロトタイプの継承で詳しく説明しているように、Number
オブジェクトをコンストラクタとして使用する理由はほとんど、あるいはまったくないでしょう。これは、数値リテラルの代わりに Number
オブジェクトが作成されるためです。
let numObject = new Number( 15 );
numObject;
> Number { 15 }
このオブジェクトは、算術演算で割り当てられた値として動作しますが、データ型が一致しないため、数値リテラルとの厳密な等価比較に失敗します。リテラル値に比べると実質的なメリットはありません。
let tenObject = new Number( 10 );
tenObject + 5;
> 15
tenObject === 10;
> false
浮動小数点数と整数
JavaScript は、-2^1024
~2^1024
の間の 64 ビット IEEE 754-1985 倍精度浮動小数点数の 1 つの数値型のみを持ちます。JavaScript は数値をメモリに保存する前に、その数値を 2 進浮動小数点数(浮動小数点数float)に変換します。
この 64 ビットのストレージ(正または負の「符号」ビットが 1 つ、指数は 11 ビット、小数は 52 ビット)では、許容範囲内に収まらない桁数で精度エラーが発生する可能性があります。この制限は、JavaScript の数値データ型に固有のものです。
0.1 + 0.7
> 0.7999999999999999
数値は、代わりに整数として格納できます。整数とは、-(2^53 − 1)
と 2^53 − 1
の間で小数を持たない浮動小数点数です。浮動小数点数と整数は基本的に同じ方法で格納されるため、これらの数値の動作に実際的な違いはありません。ただし、精度の誤差を避けるため、可能な限り整数を使用することをおすすめします。
数値演算子
数値プリミティブとともに標準の算術演算子を使用する場合は、演算の順序が適用されます。かっこで囲まれた式が最初に評価され、その後に指数、乗算、除算、加算、減算が評価されます。
演算子 | 名前 | 説明 | 使用量 | 結果 |
---|---|---|---|---|
+ |
加算 | 2+2 |
4 |
|
- |
減算 | 4-2 |
2 |
|
* |
乗算 | 2*5 |
10 |
|
/ |
部門 | 10/5 |
2 |
|
++ |
増分 | 数値に 1 を足します | 2++ |
3 |
-- |
減らす | 数値から 1 を減算する | 3-- |
2 |
** |
指数 | 第 1 オペランドを 第 2 オペランドでべき乗した結果を返します。 |
2**4 |
16 |
% |
残り | の第 1 オペランドを第 2 オペランドで割ったときの余りを返します。 |
12%5 |
2 |
また、数学的代入演算子を使用して変数の値に対して数学演算を実行し、新しく計算された値を変数にすぐに代入することもできます。
演算子 | 名前 | 使用量 |
---|---|---|
+= |
追加の割り当て | myValue += 2 |
-= |
減算の代入 | myValue -= 2 |
*= |
乗算の割り当て | myValue *= 2 |
/= |
部門の割り当て | myValue /= 2 |
**= |
指数の割り当て | myValue **= 2 |
%= |
残りの割り当て | myValue %= 2 |
シンボリック値
数値プリミティブは、いくつかの特殊なケースにも適用されます。「数値でない」値(NaN
)と、無限大を表す値は正(Infinity
)または負(-Infinity
)のいずれかです。
ゼロで除算した結果、Infinity
が発生することはほとんどありません。このようなケースでは、ほとんどのプログラミング言語でエラーがスローされます。
10 / 0
> Infinity
JavaScript では大文字と小文字が区別されます。Infinity
は無限大の概念を表す数値データ型ですが、infinity
は特別な意味を持ちません。
Infinity
> Infinity
infinity
> Uncaught ReferenceError: infinity is not defined
NaN
(「Not a Number」)は、算術演算の結果を数値で表現できない場合に、より頻繁に出現します。たとえば、JavaScript は値とコンテキストからデータ型を推測するため、数値のみを含む文字列リテラルを算術演算で使用できます。
"2" * 2;
> 4
ただし、その文字列を数値として解析できない場合、数学演算の結果は数値以外の値になります。
"two" * 2;
> NaN
数学演算で無効な値が数値として表される場合、NaN
が返されます。以下に例を示します。
- コンバージョンの失敗回数(例:
parseInt( undefined )
) - 結果が実数でない算術演算(例:
0 / 0
、Math.sqrt( -10 )
) - 不確定の結果を持つ算術演算(
0 * Infinity
) - 明示的な
NaN
(NaN + 2
)またはNaN
の結果(2 * "string" / 2
)のいずれかを含む算術演算
理解度をチェックする
false
を Number()
に渡すとどうなりますか。
次の数値演算の結果は何ですか。
"Six" * 3