声明的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)
所以我的问题是:
Date对象的副本,例如date2 = new Date().setTime(date.getTime())?直接来自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)