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而不仅仅是复制工作解决方案吗?
当你这样做时:
\n\ndateinterval[dateinterval.length] = dateinterval[0].setDate(datointerval[0].getDate() + i);\nRun Code Online (Sandbox Code Playgroud)\n\ndateinterval[0].setDate(\xe2\x80\xa6)您正在将的返回值分配给dateinterval[\xe2\x80\xa6]。该返回值是Date 对象的时间剪辑或内部时间值(自 1970 年 1 月 1 日以来的毫秒数)。请参阅ECMA-262 \xc2\xa720.3.4.20。
所以需要先修改Date:
\n\ndateinterval[0].setDate(datointerval[0].getDate() + i);\nRun Code Online (Sandbox Code Playgroud)\n\n然后分配对该对象的引用:
\n\ndateinterval[dateinterval.length] = dateinterval[0];\nRun Code Online (Sandbox Code Playgroud)\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\nRun Code Online (Sandbox Code Playgroud)\n\nOP似乎期望setDate返回原始Date对象,但事实并非如此,它返回timevalue。如果setDate 的返回值转换为日期,原始函数将起作用:
\n\ndateinterval[dateinterval.length] = new Date(dateinterval[0].setDate(datointerval[0].getDate() + i));\nRun Code Online (Sandbox Code Playgroud)\n\n然而,这会丢弃原始的 Date 对象并创建一个新的。
\n