使用Date对象调用Date构造函数

xph*_*xph 7 javascript

声明的JS文档Date有四种方法可以使用Date构造函数.来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date:

new Date();
new Date(value); // integer
new Date(dateString); // string
new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);
Run Code Online (Sandbox Code Playgroud)

但是,通过传入有效的日期对象,似乎有第五种方法来使用构造函数.例如,以下在chrome控制台中工作正常:

date = new Date() // Wed Sep 02 2015 16:30:21 GMT-0700 (PDT)
date2 = new Date(date) // Wed Sep 02 2015 16:30:21 GMT-0700 (PDT)
Run Code Online (Sandbox Code Playgroud)

它们是不同的对象,因此它似乎是一种复制日期的简单方法:

date2 === date // false
date.setMonth(1) // 1422923421090
date // Mon Feb 02 2015 16:30:21 GMT-0800 (PST)
date2 // Wed Sep 02 2015 16:30:21 GMT-0700 (PDT)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. 为什么这不在官方文档中?我错过了什么吗?
  2. 这是构造函数的官方支持使用吗?它适用于所有平台/浏览器吗?
  3. 这是一种安全的方式来制作一个Date对象的副本,例如date2 = new Date().setTime(date.getTime())

jfr*_*d00 7

直接来自ECMAScript 6规范的相关部分:

如果 Type(value) 是 Object 并且 value 有一个 [[DateValue]] 内部槽,那么让 tv 成为 thisTimeValue(value)。

这基本上是说,如果您向 Date 构造函数传递一个参数并且它是一个对象并且它具有[[DateValue]]内部插槽,则使用它来初始化新对象。

因此,您所看到的内容记录在规范中。

这里有更多细节:

在此处输入图片说明

但是,ES5 规范不一样,当你做你正在做的事情时,它会转换为字符串,然后构造函数将其解析为字符串。虽然这可以将所有内容保留到秒,但它不会保留毫秒,因为默认字符串转换中不存在这些毫秒。所以,如果你想要一个完美的副本,那么你应该在 ES5 或更早的版本中这样做:

var date = new Date();
var date2 = new Date(date.getTime());
Run Code Online (Sandbox Code Playgroud)