JavaScript においては数値はすべて 64 ビットの浮動小数点数として扱われる。他のプログラミング言語においては整数と浮動小数点数を別のデータ型として管理するものもあるが、 JavaScript においてはすべての数値は浮動小数点数として扱われる。
ただ数値をプログラムの中で記述する時には整数は整数の値として記述でき、浮動小数点数は浮動小数点数の値として記述することができる。
プログラムの中で整数の値を記述するときに使用するのが整数リテラル。整数は普段よく使用する 10 進数のほかに 16 進数、 8 進数、 2 進数でも記述することができる。
10 進数の場合は数値をそのまま記述。
let num = 141;
16 進数の場合は数値の先頭に 0x をつけて記述。 0x は 0X でも構わない。また数値の A~F は a~f でも可。
let num = 0x8B; // 141 を 16 進数で表した値
8 進数の場合は数値の先頭に 0o をつけて記述。 0o は 0O でも構いまわないが、文字が似ているので小文字の 0o のほうを推奨。
let num = 0o215; // 141 を 8 進数で表した値
2 進数の場合は数値の先頭に 0b をつけて記述。 0b は 0OB でも可。
let num = 0b10001101; // 141 を 2 進数で表した値
どの形式で整数リテラルを記述したとしても、内部的には違いはない。コンソールに出力すると 10 進数の値として出力される。
プログラムの中で浮動小数点数の値を記述するときに使用するのが浮動小数点数リテラルである。浮動小数点数は 15.742 のようにそのまま記述する方法と、 7.5e-3 のような指数形式でも記述することができる。
let num1 = 4.852;
let num2 = 3.2e5; // 3.2 × 105
let num3 = 4.7e-6; // 4.7 × 10-6
指数を表す e は大文字の E でも構わない。
どの形式で浮動小数点数リテラルを記述したとしても、内部的には違いはない。コンソールに出力すると小数点形式の値として出力される。
console.log(4.852);
>> 4.852
console.log(3.2e5);
>> 320000
console.log(4.7e-6);
>> 0.0000047
Number オブジェクトは数値のラッパーオブジェクトである。数値に対して Number オブジェクトのメソッドを呼び出すと、数値が自動的に Number オブジェクトに変換されてメソッドが呼び出される。
通常 Number オブジェクトを直接作成する必要はあまりないが、オブジェクトを作成するには Number オブジェクトのコンストラクタを使用する。
new Number(value)
引数には Number オブジェクトの値を指定する。数値以外を指定した場合は、いったん数値に変換されたあとで値として設定される。値は Number オブジェクトがラップするプリミティブ値として設定される。
let obj1 = new Number(73);
console.log(obj1);
>> Number {73}
let obj2 = new Number('73');
console.log(obj2);
>> Number {73}
let obj3 = new Number('good day');
console.log(obj3);
>> Number?{NaN}
Number オブジェクトが持つプリミティブ値を取得するには、 Number オブジェクトで用意されているインスタンスメソッドの valueof メソッドを使用する。書式は次の通り。
numberObj.valueOf()
指定した Number オブジェクトが持つプリミティブ値を返す。
let obj = new Number(73);
console.log(obj.valueOf());
>> 73
Number オブジェクトにはよく使用される静的プロパティが用意されている。下記はその一部。
プロパティ |
説明 |
---|---|
Number.MAX_SAFE_INTEGER | 安全な整数の最大値 (2^53 - 1) |
Number.MIN_SAFE_INTEGER | 安全な整数の最小値 (-(2^53 - 1)) |
Number.MAX_VALUE | 表現できる正の数の最大値 |
Number.MIN_VALUE | 表現できる正の数の最小値 |
Number.NaN | "Not a Number" (数値ではない) を表す値 |
Number.POSITIVE_INFINITY | 無限大 |
Number.NEGATIVE_INFINITY | 負の無限大 |
安全な整数とは難しい言葉になるが、正確に IEEE-754 倍精度数として表すことができ、別の値を IEEE-754 倍精度数として表した値と一致することがない値である。実際の値は次のようになる。
console.log(Number.MAX_SAFE_INTEGER);
>> 9007199254740991
console.log(Number.MIN_SAFE_INTEGER);
>> -9007199254740991
表現できる正の数の最大値は表示できる最大の値で、これを超える値は Infinity と表示される( Infinity とはグローバルプロパティのひとつで無限大を表す)。また表現できる正の数の最小値とは 0 に最も近い正の値である。実際の値は次のようになる。
console.log(Number.MAX_VALUE);
>> 1.7976931348623157e+308
console.log(Number.MAX_VALUE * 2);
>> Infinity
console.log(Number.MIN_VALUE);
>> 5e-324
Number.NaN は数字ではない値を表す時に使われる。
console.log(Number('abc'));
>> NaN
Number.POSITIVE_INFINITY は無限大、 Number.NEGATIVE_INFINITY は負の無限大を表す。
console.log(Number.POSITIVE_INFINITY);
>> Infinity
console.log(Number.NEGATIVE_INFINITY);
>> -Infinity
Number オブジェクトの toString メソッドは、対象の数値を指定した基数の形式で表した文字列を返す。
数値.toString([基数])
数値を 2 進数であらわした文字列を取得するには基数に 2 を、数値を 16 進数であらわした文字列を取得するには基数に 16 を指定する。指定可能な値は 2 から 36 まで。基数は省略可能でデフォルトの値は 10。
Number オブジェクトの toExponential メソッドは、対象の数値を指数形式で表した文字列を返す。
数値.toExponential([小数点の後の桁数])
数値を指数形式で表した文字列を返す。小数点数の前の桁は 1 、小数点の後の桁は引数で指定した数となる。引数を省略した場合は元の数値を表示するのに必要となる桁数となる。
引数で指定した桁数で表示しきれない部分はより近い値へ丸められる。
Number オブジェクトの toFixed メソッドは、対象の数値を固定小数点数形式で表した文字列を返す
数値.toFixed([小数点の後の桁数])
数値を固定小数点数形式で表した文字列を返す。小数点数の前の桁は元の数値のまま、小数点の後の桁は引数で指定した数となる。引数を省略した場合のデフォルト値は 0 。
引数で指定した桁数で表示しきれない部分はより近い値へ丸められる。また数値を表すのに必要な桁数よりも引数で指定した桁数が多い場合は 0 で埋められる。
Number オブジェクトの toPrecision メソッドは、対象の数値の有効桁数を指定し、そのあとで数値を文字列に変換した値を返す。
数値.toPrecision([有効桁数])
数値の有効桁数を引数に指定した値に変更し、そのあとで文字列に変換した値を返す。引数を省略した場合は、数値の有効桁数を変更せずに文字列に変換した値を返す。 引数で指定した有効桁数で表示しきれない部分はより近い値へ丸められる。また数値を表すのに必要な桁数よりも引数で指定した桁数が多い場合は 0 で埋められる。
Number オブジェクトの toLocaleString メソッドは、指定したロケールにあわせて対象の数値を文字列に変換した値を返す。
数値.toLocaleString([ロケール [, オプション]])
数値を引数に指定したロケールに合わせた形に変換したあと、そのあとで文字列に変換した値を返す。引数を省略した場合はデフォルトロケールが指定されたものとして扱われる。
プログラムの中で長整数の値を記述するときに使用するのが長整数リテラルである。長整数リテラルを記述する場合は、数値を記述したあと最後に n を記述する。
let num = 854n;
数値の場合と同じように 10 進数以外に 16 進数、 8 進数、 2 進数でも記述することができる。
let num1 = 0xB6n; // 16 進数では先頭に 0x を付ける
let num2 = 0o266n; // 8 進数では先頭に 0o を付ける
let num3 = 0b10110110n; // 2 進数では先頭に 0b を付ける
長整数は整数のみなので、小数点を持つ値を記述することはできない。エラーが発生する。
let num = 7.34n;
>> Uncaught SyntaxError: Invalid or unexpected token
また次のように BigInt オブジェクトのコンストラクタを使って長整数リテラルを作成することもできる。
let num = BigInt(1024);
console.log(num);
>> 1024n
数値リテラルで安全に表すことができる最大の数値は 2^53-1 (=9007199254740991) でこの値は Number.MAX_SAFE_INTEGER として定義されている。
この数値を超える値に対して演算を行うと、誤った結果となる場合がある。
let num = Number.MAX_SAFE_INTEGER;
console.log(num);
>> 9007199254740991
console.log(num + 1);
>> 9007199254740992
console.log(num + 2);
>> 9007199254740992
Number.MAX_SAFE_INTEGER + 2 = 9007199254740993 となるはずが、演算結果は 9007199254740992 となっている。このように数値リテラルでは Number.MAX_SAFE_INTEGER を超える数値は安全に扱うことができない。
それに対して長整数リテラルは任意の精度で数値を扱うことができるので、整数リテラルで安全に扱える数値を超える数値であっても安全に使用することができる。
let num = 9007199254740991n;
console.log(num);
>> 9007199254740991n
console.log(num + 1n);
>> 9007199254740992n
console.log(num + 2n);
>> 9007199254740993n
数値リテラルの時には間違った結果となった演算も長整数リテラルであれば正しい結果を取得することができる。
JavaScript では文字列として記述されたひとつひとつの文字は 16 ビットの Unicode (UTF-16) の文字として保管される。英数文字や日本語の文字だけでなく多くの文字を記述できる。
なお JavaScript のプログラムを記述したファイルで使用する文字コードは UTF-8 などを使って保管して構わない。
文字列は 0 文字以上の文字の並びである。文字列リテラルをプログラムの中で記述する場合は、シングルクォーテーション(')またはダブルクォーテーション(")で全体を囲って記述する。
let nama = 'Yamada Tarou';
let address = "東京都千代田区";
シングルクォーテーションで囲った場合とダブルクォーテーションで囲った場合で違いはない。どちらでも同じ文字列となる。
空文字(文字が 0 文字の文字列)はシングルクォーテーションまたはダブルクォーテーションだけを記述する。
let nama = '';
let address = "";
文字列の中でシングルクォーテーションを使用したい場合、または文字列の中でダブルクォーテーションを使用したい場合は少し注意が必要。どちらも文字列の開始から終了までを表す文字として使われているので、そのまま文字列の中に記述してしまうとどこからどこまでが文字列が判別できなくなりエラーが発生する。
let msg = 'Tarou's watch';
>> Uncaught SyntaxError: Unexpected identifier
シングルクォーテーションを文字列の中で記述する場合は、文字列をダブルクォーテーションで囲う必要がある。
let msg = "Tarou's watch";
同じようにダブルクォーテーションを文字列の中で記述する場合は、文字列をシングルクォーテーションで囲う。
let msg = '今日は"特売日"です';
もう一つの方法はエスケープシーケンスを使用する方法である。これは改行など特別な文字を記述したい場合の記述方法で、シングルクォーテーションやダブルクォーテーションを単なる文字として記述する場合はバックスラッシュ(\) ( Windows 環境の場合は円記号)を付けて \' または \" と記述する。エスケープシーケンスで記述する場合は、シングルクォーテーションで囲まれた文字列の中でシングルクォーテーションを使っても大丈夫である。
let msg = 'Tarou\'s watch';
console.log(msg);
>> Tarou's watch
let msg2 = "今日は\"特売日\"です";
console.log(msg2);
>> 今日は"特売日"です
文字列リテラルを入力するとき、途中で Enter キーを押して改行することはできない。
let msg = 'こんにちは。
今日はお元気ですね';
>> Uncaught SyntaxError: Invalid or unexpected token
文字列の途中で改行したい場合には改行を表すエスケープシーケンスである \n を改行したい位置に入力する。
let msg = 'こんにちは。\n今日はお元気ですね';
console.log(msg);
>> こんにちは。
>> 今日はお元気ですね
エスケープシーケンスを使用することで、改行などの特殊な文字を文字列リテラルの中で入力することができる。エスケープシーケンスはバックスラッシュ(\)( Windows の場合は円記号)と文字の組み合わせで記述することができる。
例えば文字列の中で改行を行いたいとき、通常のテキスト入力のように Enter を押してしまうと、次のようにプログラムは改行されるが文字列の中に改行が含まれるわけではあない。(エラーとなる)。
let msg = 'こんにちは。
今日は天気がいいですね。';
文字列の中で改行を行うには、改行を表すエスケープシーケンスを使用する。改行を表すエスケープシーケンスは \n なので、改行を行いたい位置に \n を入力する。
let msg = 'こんにちは。\n今日は天気がいいですね。';
実際に先ほどの文字列をコンソールに出力してみると、 \n が記述された位置で改行されていることが確認できる。
let msg = 'こんにちは。\n今日は天気がいいですね。';
console.log(msg);
--> こんにちは。
今日は天気がいいですね。
このようにエスケープシーケンスを使用することで、特殊な文字を文字列の中で記述することができるようになる。
利用可能なエスケープシーケンスの一覧は次の通りである。
エスケープシーケンス | 意味 |
---|---|
\b | バックスペース |
\t | 水平タブ |
\v | 垂直タブ |
\n | 改行 |
\ | 復帰 |
\f | 改ページ |
\' | シングルクォーテーション |
\" | ダブルクォーテーション |
\` | バッククォート |
\\ | バックスラッシュ |
\0 | NULL文字 |
\xXX | 2桁の16進数が表すLatin-1文字 |
\uXXXX | 4桁の16進数が表すUnicode文字 |
\u{XXXXXX} | 16進数のコードポイントが表すUnicode文字 |