将数组传递给Javascript Date构造函数,它是标准的吗?

Edw*_*son 11 javascript date

这适用于Chrome:

var dateArray = [2012, 6, 5];
var dateObject = new Date(dateArray);
Run Code Online (Sandbox Code Playgroud)

我得到2012年6月5日.我也试过Android浏览器,我得到了相同的结果.但是,这在Firefox或Safari中不起作用.我可以说:

var dateObject = new Date(2012, 6, 5);
Run Code Online (Sandbox Code Playgroud)

但这应该是2012年7月5日,它应该是,而且也是我用Chrome获得的.

我的问题:是ECMA标准的第一个示例部分吗?仅仅是Chrome更具优势,我希望其他浏览器能在未来支持它吗?或者它只是一些v8-ism,我应该避免可移植性?

我一直试图找到这个特定形式的Date构造函数的引用,但无法得到任何.

Jam*_*ice 20

ES5规范详细说明了构造函数的new Date(value)形式Date.在处理此表单的算法中,value通过调用对象的[[DefaultValue]]内部方法将其转换为原始值.

将数组转换为原始值基本上是通过将数组转换为字符串来完成的.将数组转换为字符串(Array.prototype.toString)实际上与调用相同dateArray.join().

因此,您对Date构造函数的调用将实际上如下所示:

var dateObject = new Date("2012,6,5");
Run Code Online (Sandbox Code Playgroud)

如果Date.parse方法可以识别字符串,则最终会得到一个Date实例.

在这种形式的Date构造也列在MDN作为new Date(dateString).

传递数组时Firefox似乎失败,但如果传递该数组的字符串表示形式,则会成功.我会说这可能是一个Firefox错误,但我可能会误解ES5规范.


Ill*_*tor 7

您可以在ES6中使用扩展语法

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

console.log('Spread:', dateObject);
console.log('Direct:', new Date(2012, 6, 5));
Run Code Online (Sandbox Code Playgroud)