背景说明
我问了一个关于使用循环定义日期数组的问题。
数组是根据名为“dateinterval”的已声明变量定义的。我设计代码的方式导致了与另一个循环相关的错误消息,另一个用户为我提供了另一个循环来解决这个问题。
既然我已经仔细比较了两种不同的解决方案,我就是不明白为什么它们不会产生相同的结果。
我的代码
我开发了以下代码来定义 UTC 格式的日期数组。然而,结果是自 1970 年 1 月 1 日 00:00:00 以来以毫秒为单位的日期数组。换句话说,一个数字。
for (var i=0; i < difference; i++){
dateinterval[dateinterval.length] = dateinterval[0].setDate(datointerval[0].getDate() + i);
};
正确的解决方案
下面的代码是另一位用户提供给我的正确代码(再次感谢您!)此代码定义了一组 UTC 日期。
for (var i = 0; i < difference; i++) {
var dt = new Date(dateinterval[0]);
dt.setDate(dt.getDate() + i);
dateinterval[dateinterval.length] = dt;
};
我不明白的地方
我几乎失明了,因为我盯着这两种不同的解决方案来弄清楚有什么区别,但我就是不明白。
在我未经训练的情况下,这两段代码似乎执行完全相同的操作,唯一的区别在于它们的结构。我被告知 setDate
返回毫秒,并且在我的代码中这些毫秒被分配给数组。但在正确的解决方案中,变量 DT
也被分配了一个 setDate
值 - 据我所知 - 也应该以毫秒为单位。那么为什么这条线:
dateinterval[dateinterval.length] = dt;
没有将毫秒分配给 dateinterval 数组?
任何人都可以向我解释一下,以便我可以更好地理解 Javascript 而不仅仅是复制有效的解决方案吗?
最佳答案
当你这样做时:
dateinterval[dateinterval.length] = dateinterval[0].setDate(datointerval[0].getDate() + i);
您正在将 dateinterval[0].setDate(…)
的返回值分配给 dateinterval[…]
。该返回值是 timeclip或 Date 对象的内部时间值(自 1970 年 1 月 1 日起的毫秒数)。参见 ECMA-262 §20.3.4.20 .
所以需要先修改Date:
dateinterval[0].setDate(datointerval[0].getDate() + i);
然后为该对象分配一个引用:
dateinterval[dateinterval.length] = dateinterval[0];
编辑
看一个简单的案例可能会有帮助。
// Create a new Date for 2015-01-01
var date = new Date(2015,0,1);
// Change the date to 2015-01-02
var x = date.setDate(2);
// The return value from the method is the internal timevalue
console.log(x);
// Check the timevalue
console.log(new Date(x)); // 2 January, 2015
OP 似乎期望 setDate 返回原始的 Date 对象,但它没有,它返回了 timevalue。如果将 setDate 的返回值转换为日期,则原始函数将起作用:
dateinterval[dateinterval.length] = new Date(dateinterval[0].setDate(datointerval[0].getDate() + i));
然而,这会丢弃原始 Date 对象并创建一个新对象。
关于javascript - 深入理解 : How code structure affects the content of date arrays created with loops,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29917374/