深入理解:代码结构如何影响使用循环创建的日期数组的内容

rab*_*tco 6 javascript arrays loops date

背景说明

我问了一个关于使用循环定义日期数组的问题.

该数组是根据名为"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);
};
Run Code Online (Sandbox Code Playgroud)

适当的解决方案

下面的代码是另一个用户提供给我的正确代码(再次感谢!)此代码定义了一个UTC日期数组.

for (var i = 0; i < difference; i++) {
    var dt = new Date(dateinterval[0]);
    dt.setDate(dt.getDate() + i);
    dateinterval[dateinterval.length] = dt;
};
Run Code Online (Sandbox Code Playgroud)

我不明白

我几乎失明了,因为他们盯着两种不同的解决方案来弄清楚差异是什么,我只是不明白.

对于未经训练的人来说,似乎两段代码执行完全相同的操作,唯一的区别在于它们的结构.我被告知setDate返回millisecs,在我的代码中,这些毫秒被分配给数组.但在适当的解决方案中,变量DT也被赋予一个setDate值 - 据我所知 - 它也应该是毫秒.那么为什么这条线:

dateinterval[dateinterval.length] = dt;
Run Code Online (Sandbox Code Playgroud)

不将millisecs分配给dateinterval数组?

任何人都可以向我解释这一点,以便我可以更好地理解 Javascript而不仅仅是复制工作解决方案吗?

Rob*_*obG 3

当你这样做时:

\n\n
dateinterval[dateinterval.length] = dateinterval[0].setDate(datointerval[0].getDate() + i);\n
Run Code Online (Sandbox Code Playgroud)\n\n

dateinterval[0].setDate(\xe2\x80\xa6)您正在将的返回值分配给dateinterval[\xe2\x80\xa6]。该返回值是Date 对象的时间剪辑或内部时间值(自 1970 年 1 月 1 日以来的毫秒数)。请参阅ECMA-262 \xc2\xa720.3.4.20

\n\n

所以需要先修改Date:

\n\n
dateinterval[0].setDate(datointerval[0].getDate() + i);\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后分配对该对象的引用:

\n\n
dateinterval[dateinterval.length] = dateinterval[0];\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑

\n\n

看一个简单的案例可能会有所帮助。

\n\n
// Create a new Date for 2015-01-01\nvar date = new Date(2015,0,1);\n\n// Change the date to 2015-01-02\nvar x    = date.setDate(2);\n\n// The return value from the method is the internal timevalue\nconsole.log(x);\n\n// Check the timevalue\nconsole.log(new Date(x)); // 2 January, 2015\n
Run Code Online (Sandbox Code Playgroud)\n\n

OP似乎期望setDate返回原始Date对象,但事实并非如此,它返回timevalue如果setDate 的返回值转换为日期,原始函数将起作用:

\n\n
dateinterval[dateinterval.length] = new Date(dateinterval[0].setDate(datointerval[0].getDate() + i));\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,这会丢弃原始的 Date 对象并创建一个新的。

\n