将数组传递给Javascript Date构造函数,是标准的吗?
Passing an array to the Javascript Date constructor, is it standard?
这在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();
- ES6构造函数返回基类的实例
- 使用Google Visualization动态调用构造函数
- javascript中对象构造函数中的var属性与this.properties
- 理解typescript中的构造函数接口
- 为什么构造函数不是构造函数
- 如果在构造函数中有“返回”,则在 JavaScript 中的新运算符中做了什么
- 拦截对构造函数的调用
- 使用闭包共享构造函数参数
- 文本表示法VS.构造函数,用于在JavaScript中创建对象
- 从js引擎的角度来看闭包和构造函数是如何工作的
- 如何使用此从对象访问构造函数
- Javascript:为什么是构造函数's __proto__属性Empty(){}
- 当一个重要的构造函数参数丢失时应该发生什么
- Chrome Javascript日期构造函数错误
- 如何使用构造函数's的输出,以便将值插入到对象中
- 为什么在调用父构造函数时在[]中发送数据
- 构造函数函数闭包变量
- ES6类是否与构造函数相同
- 将数组传递给Javascript Date构造函数,是标准的吗?
- 即使当前时间是标准时间,Javascript日期构造函数也默认为夏令时