型が諸々変わりますなあ。

typeof (      Date  );  // => "function"
typeof (      Date());  // => "string"
typeof (  new Date());  // => "object"
typeof ( +new Date());  // => "number"
typeof (1+new Date());  // => "string"
typeof ( !new Date());  // => "boolean"

あんまり Date 特有の動きっていうのもないんだけど、せっかくなのでまとめて解説してみます。

Date

Date はJavaScriptのコアに組み込みのコンストラクターですね。関数です。なので typeof Date は当然 "function" になります。

いやJavaScriptじゃないけど

正確にはJavaScriptじゃなくてECMAScriptの仕様になります。

というわけで、本記事はECMA-262の15.9 Date Objectsとかを参照しております。

Date()

で、このコンストラクターを関数として実行すると、現在時刻を文字列で返してくれます。

引数はありません。内部的には (new Date()).toString() が実行されます。

本当は引数あるんだけどね

実は、仕様上は以下の形式で引数を受け付ける事になっています。

  • Date ( [ year [, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] ] ] )

が、与えられた引数は受け取るが完全に無視するという仕様なので、結局意味ありません。なんのこっちゃ。

どういう経緯なのかな。最初からなしで良かったんじゃないかなー。

new Date()

いよいよコンストラクターをコンストラクターとして利用します。 Date.prototype を参照するオブジェクト、つまり Date オブジェクトを生成します。

こちらは関数として実行した場合と異なり、三種類の引数を受け付けます。

  • new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
  • new Date (value)
  • new Date ( )

value に数値を与えると、 ()からの経過時間(ミリ秒)として判断されます。UNIX時間ってやつですね、他言語と一緒です。(他言語は経過時間の単位がミリ秒じゃなくて秒である事の方が多いか。)

value には "2012-08-06" のような文字列を与える事ができます。文字列は日付を表すものとして解析されます。

value に文字列以外を渡した場合、数値化され、前述のUNIX時間として利用されます。ちなみに Date オブジェクトを渡しても(数値に変換されるため)大丈夫です。

それと年月日時分秒を複数の引数で与える事ができますが、 year だけを与える事はできません。引数がひとつであった場合に、それが year であるのか value であるのかが判断できないので。判断できないというか、全部 value として判断されます。

ただし数値 2012 は駄目でも文字列 "2012" なら大丈夫です。というのも、いずれも value と判断されるんだけど、文字列の場合は解析が行われるため。つまり "2012-08-05" みたいな指定だけど月と日は省略されているね、という判定になるわけです。

value を文字列で与える場合の書式は何パターンかあるみたいです。あと仕様とは別に実装にも依るみたい。面倒なので省略。

+new Date()

オブジェクトに正の数である事を表現する + を付けると数値になります。

これは単項演算子 + の仕様。 +obj で obj を数値化してから正の数にします。

1+new Date()

オブジェクトを足し算 + すると、今度は文字列になります。

これは加算演算子 + の仕様。必ずしも文字列になるとは限りませんが、まあだいたい文字列になります。(例えば Number オブジェクトは数値になる。)

!new Date()

論理否定演算子 ! を使うと真偽値、つまり true か false になります。これは有名かと思います。

おしまい。