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

Passing an array to the Javascript Date constructor, is it standard?

本文关键字:标准 构造函数 Date 数组 Javascript      更新时间:2023-09-26

这在Chrome中有效:

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

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

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

但那将是 2012 年 7 月 5 日,因为它应该是,这也是我从 Chrome 上得到的。

我的问题:第一个示例是ECMA标准的一部分吗?只是Chrome更前沿,我可以期望其他浏览器将来支持它吗?或者只是一些 v8 主义,为了可移植性,我应该避免?

我一直在尝试查找 Date 构造函数的这种特定形式的引用,但无法获得任何引用。

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

将数组转换为

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

因此,对 Date 构造函数的调用将有效地如下所示:

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

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

这种形式的Date构造函数在 MDN 上也列为 new Date(dateString)

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

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

let dateArray = [2012, 6, 5];
let dateObject = new Date(...dateArray);
console.log('Spread:', dateObject);
console.log('Direct:', new Date(2012, 6, 5));

这个怎么样:

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

您可以使用 apply 调用使用bind创建的新函数,并将数组项作为参数。

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

基于 Jure 的回答。我已经澄清了塞尔吉奥在评论中的问题,表明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();