15

これはChromeで機能します:

var dateArray = [2012, 6, 5];
var dateObject = new Date(dateArray);

そして、2012 年 6 月 5 日を取得します。Android ブラウザーでも試してみましたが、同じ結果が得られました。ただし、これは Firefox や Safari では機能しません。私は言うことができます:

var dateObject = new Date(2012, 6, 5);

しかし、それは当然のことながら 2012 年 7 月 5 日であり、Chrome で得られるものでもあります。

私の質問: 最初の例は ECMA 標準の一部ですか? Chrome が最先端であり、将来的に他のブラウザがサポートすることを期待できるのでしょうか? それとも、移植性のために避けるべきv8主義ですか?

この特定の形式の Date コンストラクターの参照を見つけようとしましたが、何も取得できませんでした。

4

4 に答える 4

24

ES5 仕様では、コンストラクターのnew Date(value)形式が詳しく説明されています。Dateこのフォームを処理するアルゴリズムでは、オブジェクトの内部メソッドvalueを呼び出してプリミティブ値に変換します。[[DefaultValue]]

配列をプリミティブ値に変換するには、基本的に配列を文字列に変換します。配列を文字列 ( Array.prototype.toString) に変換することは、実質的に を呼び出すことと同じdateArray.join()です。

したがって、Dateコンストラクターへの呼び出しは実質的に次のようになります。

var dateObject = new Date("2012,6,5");

Date.parse文字列がメソッドによって認識できる場合は、Dateインスタンスになります。

この形式のDateコンストラクターは、MDN にもとしてリストされnew Date(dateString)ています。

Firefox は配列を渡すと失敗するように見えますが、その配列の文字列表現を渡すと成功します。おそらく Firefox のバグだと思いますが、ES5 の仕様を誤解している可能性があります。

于 2012-07-02T09:56:40.527 に答える
4

How about this:

new (Function.prototype.bind.apply(
   Date, [null].concat([2011, 11, 24])
))

You use apply to call the new function you created using bind with array items as arguments.

Source: http://www.2ality.com/2011/08/spreading.html

于 2014-10-27T14:02:18.323 に答える
2

Jureの答えに基づいています。実際、これが通話の範囲であることを示すことで、コメントでSergio の質問をクリアしました。null

function newInstance(clazz, arguments, scope) {
  return new (Function.prototype.bind.apply(clazz, [scope].concat(arguments)));
}

// Scope is not needed here.
var date = newInstance(Date, [2003, 0, 2, 4, 5, 6]);

// 1/2/2003, 4:05:06 AM (Locale = US EST)
document.body.innerHTML = date.toLocaleString();

于 2016-04-04T16:57:34.340 に答える