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

时间:2016-01-05 00:44:03

标签: javascript

我想创建一个间隔几个小时的日期对象列表。因此,10小时将是:“星期一,20:00->星期二,6:00->星期二,16:00”等等。我的想法是使用“基础”日期,如前一个例子中的“Monday 20:00”,所以“base.setHours(20),base.setHours(30),base.setHours(40)”得到了结果

但是一旦我以一种使Date对象的“day”改变的方式调用setHours(),那么这种改变是永久性的。所以,在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 ,以及最后两个输出的月份奇怪行为的原因是什么?

1 个答案:

答案 0 :(得分:1)

将Date实例的引用从一个变量分配给另一个变量不会复制。你必须明确地建立一个新的日期:

  var loopday = new Date(base);

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