javascript - 深入理解 : How code structure affects the content of date arrays created with loops

标签 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);
};

正确的解决方案

下面的代码是另一位用户提供给我的正确代码(再次感谢您!)此代码定义了一组 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/

相关文章:

java - 如何将对象数组转换为任意内容类型 T (Object[] -> T[])

python - 如何迭代不同数据帧中的行并将其用作其他数据帧中的值?

c - 使用 C 语言控制指令练习解决的问题

javascript - MySQL 和 PHP : Loop through table find value if it exists update if not insert new value

javascript - 如何只显示一次点击弹窗

c++ - 将数组传递给 void 函数,并递归打印元素

r - 在R中的特定时间暂停特定时间的循环

javascript - 在 querySelectorAll 的选择器中使用变量

javascript - 使用 jQuery 更改 CSS 类

python - 高效返回数组中第一个满足条件的值的索引