Javascript 如何克隆日期对象?

Javascript 如何克隆日期对象?,javascript,Javascript,将Date变量分配给另一个变量将把引用复制到同一实例。这意味着改变一个将改变另一个 如何实际克隆或复制日期实例?使用对象的方法,该方法返回自1970年1月1日00:00:00 UTC()以来的毫秒数: 在Safari 4中,您还可以编写: var date = new Date(); var copiedDate = new Date(date); …但我不确定这是否适用于其他浏览器。(在IE8中似乎有效)。这是最干净的方法 let dat=新日期() 让copyOf=新日期(dat.val

Date
变量分配给另一个变量将把引用复制到同一实例。这意味着改变一个将改变另一个

如何实际克隆或复制日期实例?

使用对象的方法,该方法返回自1970年1月1日00:00:00 UTC()以来的毫秒数:

在Safari 4中,您还可以编写:

var date = new Date();
var copiedDate = new Date(date);

…但我不确定这是否适用于其他浏览器。(在IE8中似乎有效)。

这是最干净的方法

let dat=新日期()
让copyOf=新日期(dat.valueOf())
控制台日志(dat);
控制台日志(副本)简化版:

Date.prototype.clone = function () {
    return new Date(this.getTime());
}

我发现这个简单的任务也有效:

dateOriginal = new Date();
cloneDate = new Date(dateOriginal);
但我不知道它有多“安全”。在IE7和Chrome 19中成功测试。

var orig=新日期();
var副本=新日期(+原始日期);
控制台日志(原件、复印件)

我将oldDate传递给函数并从这个.oldDate生成newDate,但它也改变了这个.oldDate。所以我使用了上面的解决方案,它成功了。

用于“Date”对象的“valueOf()”方法产生的结果与它的“getTime()”方法(从纪元时间开始的毫秒数)相同。@Steve:true,但getTime()可以“looks”它只返回时间,不包含日期,因此我引用了“最干净的”。坦率地说,Javascript中的日期类型有点像灾难地带,它本来就不应该是可变的。@AnthonyWJones:对,我明白你的意思。我同意.valueOf()更清楚。有时我会忘记并使用.getmillizes()b/c,这听起来像是指从大纪元开始算起的毫秒数。+1对Steve Harrison说:我想知道情况是否如此,谢谢你对这个片段的澄清。JSON?听起来这些人应该把基本知识弄清楚。。。类似于将jQuery误认为是JavaScript DOM。编写这个不错的解决方案的另一种方法是扩展日期原型:
Date.prototype.clone=function(){return new Date(this.getTime());}
然后可以用作
copiedDate=date.clone()复制日期=新日期(日期)
方法在IE6+中有效。在Firefox中,这两个选项的速度相同。
new Date(Date)
new Date(Date.getTime())
相同,因为JS在需要数字时会尝试调用
Date.valueOf()
,而
Date.valueOf()
Date.getTime()相同,请不要使用
new Date(Date)
,使用
new Date(date.getTime()
新日期(date.valueOf)
,因为第一种方法至少会导致Firefox和IE(而不是Chrome)中的日期之间的差异。例如,在Firefox中的两个日期上使用
toISOString()
会生成
“2015-04-21T04:56:42.000Z”
“2015-04-21T04:56:42.337Z”
。我最喜欢这个解决方案。非常精确和干净:)除非你必须解释这个魔法对JS专家以外的任何人做了什么。:)
+
符号在这里是unaray运算符。它的意思是新日期(原编号)
。更多信息:仅当
orig
不是一个字符串,如
2020-09-02T06:49:51.4000654Z
时才起作用。您不应弄乱内置对象也不应弄乱您不拥有的对象。你应该在你的范围内制作一份新的副本,并称之为SuperDate或其他东西。很多难以测试的bug都是由于对象功能的意外更改造成的。这是可行的,但出于可维护性的原因,这种方法会被认为是一种代码味道。我已经写了一种我通常在编码中使用的方法:而且我不认为有必要首先尝试向内置添加方法。研究并发现为什么一个好的老式函数实际上比对象本身的方法强大得多。它也比较短:
const cloneDate=d=>new Date(d.getTime())
。不要使用
new Date(Date)
,而是使用
new Date(Date.getTime()
new Date(Date.valueOf)
,因为第一种方法至少会导致Firefox和IE(而不是Chrome)中的日期不同。例如使用
toISOString()
在Firefox中的两个日期都会生成
“2015-04-21T04:56:42.000Z”
“2015-04-21T04:56:42.337Z”
。这在旧版本的Firefox中可能是正确的,但在最新版本中,
新日期(日期)
效果很好。试试看:
让日期='2015-04-21T04:56:42.337Z';新日期(日期)。toISOString()
。结果与输入相同:
“2015-04-21T04:56:42.337Z”
dateOriginal = new Date();
cloneDate = new Date(dateOriginal);
function cloneMyDate(oldDate){
  var newDate = new Date(this.oldDate);
}