Почему неправильно работает for

Не понимаю, почему в итоге получается 28, если должно получится 30 записей в массиве days. Эта глупая ошибка, которая у меня никогда не возникала нигде. В чем проблема?

let days = [];
let date = new Date();
for (let i = date.getDay(); i < new Date(date.getFullYear(), date.getMonth(), 0).getDate(); i++) {
  days.push({
    day: i,
    schedule: false
  });
}
for (let i = 0; i < 30 - days.length; i++) {
  days.push({
    day: i + 1,
    schedule: false
  });
}


Ответы (2 шт):

Автор решения: Igor
for (let i = 0; i < 30 - days.length; i++) {
                    ^^^^^^^^^^^^^^^^ - !!!
→ Ссылка
Автор решения: Grundy

На каждой итерации меняется длина массива days. Из-за этого вместо ожидаемых 5 итераций происходит 3.

Чтобы изменение массива не влияло, нужно вычислить количество итераций заранее:

let days = [];
let date = new Date();
for (let i = date.getDay(); i < new Date(date.getFullYear(), date.getMonth(), 0).getDate(); i++) {
  days.push({
    day: i,
    schedule: false
  });
}
var cnt = 30 - days.length;
for (let i = 0; i < cnt; i++) {
  days.push({
    day: i + 1,
    schedule: false
  });
}

console.log(days.length);

→ Ссылка