Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 深入理解:代码结构如何影响使用循环创建的日期数组的内容_Javascript_Arrays_Loops_Date - Fatal编程技术网

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

Javascript 深入理解:代码结构如何影响使用循环创建的日期数组的内容,javascript,arrays,loops,date,Javascript,Arrays,Loops,Date,背景说明 我问了一个关于使用循环定义日期数组的问题 数组是根据名为“dateinterval”的声明变量定义的。我设计代码的方式导致了与另一个循环相关的错误消息,另一个用户为我提供了另一个循环,解决了这个问题 现在我已经仔细比较了这两种不同的解决方案,我不明白为什么它们不能产生相同的结果 我的代码 我开发了以下代码来定义UTC格式的日期数组。然而,结果是自1970年1月1日00:00:00以来的一系列以毫秒为单位的日期。换句话说就是一个数字 for (var i=0; i < differ

背景说明

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

数组是根据名为“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);
};
是否不将毫秒分配给dateinterval数组

有人能给我解释一下这一点,让我更好地理解Javascript,而不仅仅是复制工作解决方案吗

dateinterval[dateinterval.length] = dateinterval[0].setDate(datointerval[0].getDate() + i);
您正在将
dateinterval[0].setDate(…)
的返回值赋值给
dateinterval[…]
。该返回值是日期对象的时间或内部时间值(自1970年1月1日起为毫秒)。看

因此,您需要首先修改日期:

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返回原始的日期对象,但它没有,它返回的是时间值。如果将setDate的返回值转换为日期,则原始函数将起作用:

dateinterval[dateinterval.length] = new Date(dateinterval[0].setDate(datointerval[0].getDate() + i));

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

的返回值是时间片段,即日期的内部时间值,即自历元(1970年1月1日)起的毫秒。换句话说,第一个版本将
Date.setDate()
的返回值指定给变量。第二个版本指定日期对象。感谢RobG快速回答。但有一件事我仍然不明白:如何:
dateinterval[0].setDate(datInterval[0].getDate()+I)修改日期?我同意答案,因为它似乎是正确的。但我脑中的灰色小细胞仍然难以将自己包裹起来o) 我能从中得到的是,将操作拆分为多个
表达式
,而不是将其聚集在一个
表达式
中,似乎可以产生所需的结果。我的大脑告诉我这是不合逻辑的,但这对Javascript来说也是全新的…@David如果它能帮助你更好地思考这个问题,你希望
setDate
方法能够支持,但事实并非如此。方法链接是setter方法返回调用该方法的对象的模式。例如,jQuery的setter方法使用以下模式:
$(“div”).text(“foo”).addClass(“bar”).hide()
。每个setter(
text
addClass
)返回原始的
$(“div”)
对象。
Date
对象的
setDate
方法不支持方法链接,因此您不能在此处使用该模式。@apsillers谢谢。这确实有帮助,尽管我的结论在某种程度上也是如此,我在这一点上是在我的头以上。需要了解更多的基础知识才能完全理解概念。但是在阅读了更多关于
对象
数组
方法链接
的内容后,我的理解是:语句
variable=object.setDate
产生了一个带有
日期对象
变量
(这里是@RobG的修改)。我的代码包含一个
语句
,由于不支持方法链接,该语句最终为数组分配了一个数字而不是一个日期对象。谢谢大家。
// 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
dateinterval[dateinterval.length] = new Date(dateinterval[0].setDate(datointerval[0].getDate() + i));