以下我从this prior SO answer进行了调整的代码尝试遍历从2/5/13到2/10/13的范围,包括两个端点。
var start = new Date("02/05/2013");
var end = new Date("02/10/2013");
var output = [];
var loop = new Date(start);
alert(loop)
while(loop < end){
output.push(loop);
var newDate = loop.setDate(loop.getDate() + 1);
loop = new Date(newDate);
}
var strings = JSON.stringify(output);
var pgraf = document.createElement('p');
var ptext = document.createTextNode(strings)
pgraf.appendChild(ptext)
document.body.appendChild(pgraf);
但是由于某种原因,我不明白,尽管循环之前的警报会像人们期望的那样警报2/5/13,但实际输出数组中的第一项是2/6/13。因此,最终附加到dom的字符串是
[“ 2013-02-06T07:00:00.000Z”,“ 2013-02-07T07:00:00.000Z”,“ 2013-02-08T07:00:00.000Z”,“ 2013-02-09T07: 00:00.000Z“,” 2013-02-10T07:00:00.000Z“]
所以这是谜团#1。
奥秘#2:我尝试通过将从输出数组的创建到循环结束的所有内容替换为:
var output = [start];
while(start < end){
var newDate = start.setDate(start.getDate() + 1);
start = new Date(newDate);
output.push(start);
}
但是这一次,输出结果甚至更奇怪:它根本不包含start变量的初始值,但是包含了两次最后一个值。
[“ 2013-02-06T07:00:00.000Z”,“ 2013-02-07T07:00:00.000Z”,“ 2013-02-08T07:00:00.000Z”,“ 2013-02-09T07: 00:00.000Z“,” 2013-02-10T07:00:00.000Z“,” 2013-02-10T07:00:00.000Z“]
很明显,我不明白这里循环中发生了什么。但是我已经使用非JS语言编程了几年了-我想认为我了解循环的工作原理!谁能告诉我我在这里搞砸了吗?
答案 0 :(得分:3)
您在while循环的最后一行中修改的loop
变量仍然与您在开始时插入数组的loop
相同。
如果您制作new Date(loop)
并将其插入,则不会产生副作用。
setDate
会修改您调用它的日期,以便在不需要循环的情况下在第三行显示。
最后,如果要同时包含开始和结束,请使用<=
而不是<
var start = new Date("02/05/2013");
var end = new Date("02/10/2013");
var output = [];
var loop = new Date(start);
while(loop <= end){
output.push(new Date(loop));
loop.setDate(loop.getDate() + 1);
}
console.log(output)