Date() と new Date() は等価ではない
概要
Native Object のコンストラクタの中には関数呼び出しとコンストラクタ呼び出しが同じ動作になるものがあります。例えば、Array()
は new Array()
と等価です。
new Array(1, 2, 3); // [1, 2, 3] Array(1, 2, 3); // [1, 2, 3]
対して、Date()
は new Date()
と等価ではありません。
new Date(2011, 0, 1, 0, 0); // Sat Jan 01 2011 00:00:00 GMT+0900 (Japan Standard Time) Date(2011, 0, 1, 0, 0); // 現在時刻 (Google Chrome 12, Firefox4, Opera 11.50, IE8 で確認)
関数呼び出しの Date()
は引数を無視して現在時刻を返しているようです。
ECMAScript 3 では
ECMAScript 3 では次のように書かれています。
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/15-9_Date_Objects.html#section-15.9.215.9.2 関数として呼ばれる Date コンストラクタ
コンストラクタとしてではなく関数として Date が呼出されるとき、それは現在時間 (UTC) のあらわす文字列を返す。
NOTE 関数呼出し Date(...) と、同じ引数を持つオブジェクト生成式 new Date(...) は、等価ではない。
なるほど。確かに Date
は現在時刻を返しています。次の小節を読んでみます。
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/15-9_Date_Objects.html#section-15.9.2.115.9.2.1 Date ( [ year [, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] ] ] )
すべたの引数は選択的である; 供給された引数は受け付けるが、それ以外は無視される。文字列が生成され、式 (new Date()).toString() によるものと同様の結果が返される。
"供給された引数は受け付ける" とありますが、受け付けた引数はどのように処理されるのでしょう…?私には矛盾しているように思えます。
(2011/07/31 15:47追記)
@rikuba さんからリプライを頂きました。ありがとうございます。
原文(ECMAScript 3)では次のように書かれています。
http://bclary.com/2004/11/07/#a-15.9.2.115.9.2.1 Date([ year [, month[, date[, hours [, minutes[, seconds[, ms]]]]]]])
All of the arguments are optional; any arguments supplied are accepted but are completely ignored. A string is created and returned as if by the expression (new Date()).toString().
下記は意訳です。
http://bclary.com/2004/11/07/#a-15.9.2.115.9.2.1 Date([ year [, month[, date[, hours [, minutes[, seconds[, ms]]]]]]])
全ての引数はオプションです。供給された全ての引数を受け入れますが、完全に無視されます。文字列(String)が生成され、式
(new Date()).toString()
の評価値が返されます。
結論
Date()
は new Date()
と等価ではありません。その点ははっきりしていますが、Date()
で受け付けた引数の扱いがよくわかりません。謎です…。
Date()
呼び出し時の全ての実引数は無視され、(new Date()).toString()
に等しいString値を返します。