Смешение поведения цикла JS с датами - PullRequest
1 голос
/ 10 марта 2019

Следующий код, который я настроил из этого предыдущего SO-ответа , пытается выполнить цикл в диапазоне от 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.

Mystery # 2: я попытался немного урезать этот код, заменив все, начиная с создания выходного массива и заканчивая концом цикла:

var output = [start];
while(start < end){           
    var newDate = start.setDate(start.getDate() + 1);
    start = new Date(newDate);
    output.push(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 языках уже несколько лет - мне нравится думать, что я понимаю, как работают циклы! Может кто-нибудь сказать мне, что я облажался здесь?

1 Ответ

3 голосов
/ 10 марта 2019

Переменная loop, которую вы изменяете в последней строке вашего цикла while, остается такой же 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...