この記事は技術レビューを必要としています。ぜひご協力ください。
この記事は編集レビューを必要としています。ぜひご協力ください。
本章では、JavaScript での数値と日付の取り扱い方について紹介します。
数値
JavaScript では、数値はすべて 64 ビット倍精度浮動小数点数のフォーマットである IEEE 754(すなわち、-(253-1) と 253-1 の間の数値)にしたがって実装されています。整数用の型は存在しません。浮動小数点数の表現に加えて、数値型は3つの記号的な値を持っています: +
Infinity
、 -
Infinity
、 NaN
(非数、not-a-number)です。JavaScript における他のプリミティブ型との関わりについては、「JavaScript のデータ型とデータ構造」もご覧ください。
4 種類の数値リテラル、10 進数、2 進数、8 進数、16 進数を使用することができます。
10 進数
1234567890 42 // 先行ゼロを使用するときは気をつけて : 0888 // 10 進数として 888 と解析される 0777 // Strict モードでない場合 8 進数として解析される(10 進数の 511 になる)
10 進数リテラルはゼロ (0
) から始めて、それ以降に 10 進の桁を続けることが可能ですが、0
に続く次の数値が 8 より小さい場合、その数値は 8 進数として解析されることに注意してください。
2 進数
2 進数の構文では、先行ゼロの後に小文字または大文字の "B" を使います(0b
または 0B
)。0b
の後の数値が 0 または 1 ではない場合、次の SyntaxError
が発生します : "Missing binary digits after 0b"(0b の後に 2 進数の桁がありません)。
var FLT_SIGNBIT = 0b10000000000000000000000000000000; // 2147483648 var FLT_EXPONENT = 0b01111111100000000000000000000000; // 2139095040 var FLT_MANTISSA = 0B00000000011111111111111111111111; // 8388607
8 進数
8 進数の構文では、先行ゼロを使用します。0
の後の数値が 0 から 7 の範囲外の場合、数値は 10 進数として解釈されます。
var n = 0755; // 493 var m = 0644; // 420
ECMAScript 5 における Strict モードでは上記の 8 進数記法を禁じています。8 進数記法は ECMAScript 5 仕様の一部ではありませんが、すべてのブラウザで先行ゼロによる 8 進数記法をサポートしています。ECMAScript 6 ではまた、先行ゼロの後に小文字または大文字の "O"(0o
または 0O
)を使う 8 進数構文をサポートしています。この構文は Strict モードでも機能します。
var a = 0o10; // ES6: 8 進数
16 進数
16 進数の構文では、先行ゼロの後に小文字または大文字の "X" を使います(0x
または 0X
)。0x の後の数値が範囲 (0123456789ABCDEF) 外の場合、次の SyntaxError
が発生します : "Identifier starts immediately after numeric literal"(数値リテラルの直後に識別子があります)。
0xFFFFFFFFFFFFFFFFF // 295147905179352830000 0x123456789ABCDEF // 81985529216486900 0XA // 10
Number
オブジェクト
ビルトイン Number
オブジェクトは最大値、NaN、無限大といった数値定数のプロパティを持っています。これらのプロパティの値は変更できません。下記のように使用します :
var biggestNum = Number.MAX_VALUE; var smallestNum = Number.MIN_VALUE; var infiniteNum = Number.POSITIVE_INFINITY; var negInfiniteNum = Number.NEGATIVE_INFINITY; var notANum = Number.NaN;
自作した Number
オブジェクトのプロパティではなく、上記の定義済み Number
オブジェクトのプロパティを常に参照してください。
次表は Number
オブジェクトプロパティの要約です。
プロパティ | 説明 |
---|---|
Number.MAX_VALUE |
表現可能な最大値。 |
Number.MIN_VALUE |
表現可能な最小値。 |
Number.NaN |
非数を表す特別な値。 |
Number.NEGATIVE_INFINITY |
負の無限大を表す特別な値。オーバーフローした際に返されます。 |
Number.POSITIVE_INFINITY |
正の無限大を表す特別な値。オーバーフローした際に返されます。 |
Number.EPSILON |
Number オブジェクトで表現可能な、ある数とそれよりも大きい最小数との差分値(計算機イプシロン)。 |
Number.MIN_SAFE_INTEGER |
JavaScript で正確に扱える最小の整数値。 |
Number.MAX_SAFE_INTEGER |
JavaScript で正確に扱える最大の整数値。 |
メソッド | 説明 |
---|---|
Number.parseFloat() |
文字列引数を解析し、浮動小数点数を返します。 グローバル関数 parseFloat() と同等。 |
Number.parseInt() |
文字列引数を解析し、指定された根(基数)の整数を返します。 グローバル関数 parseInt() と同等。 |
Number.isFinite() |
渡された値が有限数であるか否かを判定します。 |
Number.isInteger() |
渡された値が整数であるか否かを判定します。 |
Number.isNaN() |
渡された値が NaN (非数)であるか否かを判定します。原型となったグローバル関数 isNaN() よりもロバストな(対応能力が強い)バージョン。 |
Number.isSafeInteger() |
渡された値が正確に扱える整数であるか否かを判定します。 |
Number
オブジェクトのプロトタイプは様々なフォーマットの Number
オブジェクトから情報を取得するメソッドを提供します。次表は Number.prototype
のメソッドの要約です。
メソッド | 説明 |
---|---|
toExponential() |
指数表記の数値を表す文字列を返します。 |
toFixed() |
固定小数点表記の数値を表す文字列を返します。 |
toPrecision() |
特定の精度の固定小数点表記による数値を表す文字列を返します。 |
Math
オブジェクト
ビルトイン Math
オブジェクトは数学定数および数学関数のためのプロパティとメソッドを有しています。例えば、Math
オブジェクトの PI
プロパティは π (3.141...) の値を持ちます。以下のようにアプリケーション内で使用できます。
Math.PI
同様に、標準的な数学関数が Math
のメソッドにあります。数学関数には、三角関数、対数、指数、およびその他の機能が含まれます。例えば、三角関数 sin を使用したい場合、下記のように記述します。
Math.sin(1.56)
Math
のすべての三角関数メソッドはラジアンで引数を取ることに注意してください。
次表は Math
オブジェクトメソッドの要約です。
メソッド | 説明 |
---|---|
abs() |
絶対値。 |
sin() , cos() , tan() |
標準三角関数。引数はラジアン。 |
asin() , acos() , atan() , atan2() |
逆三角関数。戻り値はラジアン。 |
sinh() , cosh() , tanh() |
双曲線三角関数。戻り値はラジアン。 |
asinh() , acosh() , atanh() |
逆双曲線三角関数。戻り値はラジアン。 |
指数と対数関数。 | |
floor() , ceil() |
引数以下の最大の整数値、または引数以上の最小の整数値を返します。 |
min() , max() |
コンマで区切られた数値リストの引数から最小値または最大値をそれぞれ返します。 |
random() |
0 から 1 の間のランダムな数値を返します。 |
round() , fround() , trunc() , |
丸めと切り捨て関数。 |
sqrt() , cbrt() , hypot() |
平方根、立方根、引数の二乗の和の平方根を返す。 |
sign() |
数の符号、すなわち数が正、負またはゼロかどうかを返します。 |
clz32() ,imul() |
32 ビットのバイナリ表現にした場合の先行ゼロの個数を返す関数。 2 つの引数を C 言語のように 32 ビット乗算した結果を返す関数。 |
他の多くのオブジェクトとは異なり、決して独自の Math
オブジェクトを生成しないでください。常にビルトイン Math
オブジェクトを使用してください。
Date
オブジェクト
JavaScript には日付のためのデータ型がありません。しかし、アプリケーション内で日付を取り扱うための Date
オブジェクトとそのメソッドが利用できます。Date
オブジェクトは日付の設定、取得、操作を行う多数のメソッドを有しています。このオブジェクトはいかなるプロパティも持ちません。
JavaScript は Java と同じように日付を取り扱います。2 つの言語は同様の日付用メソッドを多く持ち、両方の言語とも 1970 年 1 月 1 日 00:00:00からのミリ秒の数値として日付を格納しています。
Date
オブジェクトの設定可能範囲は 1970 年 1 月 1 日 UTC 時間 に対し -100,000,000 日から 100,000,000 日までです。
Date
オブジェクトは以下のように生成します :
var dateObjectName = new Date([parameters]);
ここで dateObjectName
は生成された Date
オブジェクトの名前です。新しいオブジェクトか、あるいは既存のオブジェクトのプロパティにすることができます。
new
キーワードなしで Date
を呼び出すと、単に与えられた日付を文字列表現に変換します。
上記構文の parameters
は次のいずれかになります。:
- パラメータなし : 今日の日時を生成します。例えば、
today = new Date();
。 - 次のような形式による日付を表す文字列 : "Month day, year hours:minutes:seconds." 例えば、
var Xmas95 = new Date("December 25, 1995 13:30:00")
時、分、秒を省略した場合、その値はゼロに設定されます。 - 年、月、日に対応する整数の集合。例えば、
var Xmas95 = new Date(1995, 11, 25)
- 年、月、日、時、分、秒に対応する整数の集合。例えば、
var Xmas95 = new Date(1995, 11, 25, 9, 30, 0);
Date
オブジェクトのメソッド
日時を扱うDate
オブジェクトのメソッドは下記のカテゴリに分類されます。:
- set メソッド、
Date
オブジェクト内の日時の値の設定を行うメソッド - get メソッド、
Date
オブジェクトから日時を取得を行うメソッド - to メソッド、
Date
オブジェクトから文字列値を返すメソッド - parse と UTC メソッド、
Date
文字列を解析するメソッド
"get" と "set" メソッドを使用して、秒、分、時、日、曜日、月、年をそれぞれ取得、設定できます。曜日を返す getDay
メソッドはありますが、対応するsetDay
メソッドはありません。というのも、曜日は自動的に設定されるからです。これらのメソッドはそれぞれの値を表すのに下記の整数値を使用します。:
- 秒と分: 0 〜 59
- 時: 0 〜 23
- 曜日: 0 (日曜日) 〜 6 (土曜日)
- 日: 1 〜 31 (日)
- 月: 0 (1 月) 〜 11 (12 月)
- 年: 1900年からの年
例えば、次の日付を定義してみます :
var Xmas95 = new Date("December 25, 1995");
すると、Xmas95.getMonth()
は 11 を返し、Xmas95.getFullYear()
は 1995 を返します。
getTime
と setTime
メソッドは日付を比較するのに便利です。getTime
メソッドは Date
オブジェクトに対して January 1, 1970, 00:00:00 からのミリ秒の数値を返します。
例えば、次のコードでは今年に残された日数を表示します。:
var today = new Date(); var endYear = new Date(1995, 11, 31, 23, 59, 59, 999); // 月日を設定 endYear.setFullYear(today.getFullYear()); // 今年の年を設定 var msPerDay = 24 * 60 * 60 * 1000; // 一日をミリ秒に換算 var daysLeft = (endYear.getTime() - today.getTime()) / msPerDay; var daysLeft = Math.round(daysLeft); // 今年の残り日数を返す
この例では、今日の日時を含む today
と名付けられた Date
オブジェクトを生成します。それから、endYear
と名付けられた Date
オブジェクトを生成し、年を今年に設定します。そして、ミリ秒値を使用して、today
と endYear
間の日数を計算します。getTime
を使用し、日にちに丸めます。
parse
メソッドは日付文字列から既存の Date
オブジェクトに割り当てるのに便利です。例えば、次のコードは parse
と setTime
を使用し、日付の値を IPOdate
オブジェクトに割り当てます。:
var IPOdate = new Date(); IPOdate.setTime(Date.parse("Aug 9, 1995"));