Javascript Date.setHours()正在修改一个我没有引用的Date对象,使用了错误的日期

Javascript Date.setHours() is modifying a Date object that I did not reference, uses wrong day

本文关键字:Date 对象 引用 日期 错误 setHours 修改 Javascript 一个      更新时间:2023-09-26

我想创建一个间隔几个小时的日期对象列表。因此,在10个小时内,它将是:"星期一,20:00-->星期二,6:00-->星期二,16:00",依此类推。我的想法是使用一个"基准"日期,比如上一个例子中的"星期一20:00",所以"base.setHours(20),base.setHours(30),base_setHours)(40)"可以得到这个结果。

但是,一旦我以某种方式调用setHours(),使Date对象的"day"发生更改,这种更改就是永久性的。所以,在base.setHours(30)之后,base.setHours(40)从周二开始,而不是从周一开始,这正是我想要的。我试图通过使用一个临时变量loopday来修复这种行为,该变量存储真实的原始日期base,但Javascript及时返回以更改base

例如,此代码的输出:

var base = new Date(2015, 1, 4);
for(var hr = 0; hr < 50; hr += 10)
{
    var loopday = base;
    loopday.setHours(hr);
    window.alert([base.getDay(), base.getHours()]);
}

是"[4,0]、[4,10]、[4、20]、[5,6]、[6,16]、[8,2]"。首先,我希望这一切都是"[4,0]",因为我根本没有接触"天";我只修改了"loopday"。但是,从1月4日改为1月5日后,这个月的日子也错了。应该是"…,[5,6],[5,16],[6,2]"。

在实际操作层面上,我如何修改该代码,使loopday的日期和小时分别为[4,0],[4,10],[4],20],[5],6],[5,16],[6,2]?在理解的层面上,Javascript为什么要修改base,以及是什么原因导致了最后两个输出在一个月的某一天出现了奇怪的行为?

将对Date实例的引用从一个变量分配给另一个变量不会产生副本。你必须明确地制定一个新的日期:

  var loopday = new Date(base);

通常,JavaScript中对任何类型对象的引用都是在赋值、函数调用和函数返回中传递的。必须明确复制。