Я запускаю это в node.js v11.6.0

const now = new Date(Date.now()); let date = now; date.setFullYear(date.getFullYear() - 1); let str = date.getFullYear()   "-"   date.getMonth()   "-"   date.getDate(); while(!data[str]){ date = date.setDate(date.getDate() - 1); str = date.getFullYear()   "-"   date.getMonth()   "-"   date.getDate(); } 

И получить:

 trail.js:15 str = date.getFullYear()   "-"   date.getMonth()   "-"   date.getDate(); TypeError: date.getFullYear is not a function 

внутри цикла while date.setDate () работает, но date.getFullYear () не является функцией внезапно.

При вызове date.setDate(date.getDate() - 1); Вы присваиваете возвращаемое значение setDate которое является целым числом на date . Вот почему вы не можете позвонить .getFullYear позже, так как у чисел нет этого метода.

От MDN :

Возвращаемое значение

Количество миллисекунд между 1 января 1970 года 00:00:00 UTC и указанной датой (объект Date также изменяется на месте).

 while(!data[str]){ date.setDate(date.getDate() - 1); str = date.getFullYear()   "-"   date.getMonth()   "-"   date.getDate(); } в while(!data[str]){ date.setDate(date.getDate() - 1); str = date.getFullYear()   "-"   date.getMonth()   "-"   date.getDate(); } 

date.getMonth() что date.getMonth() возвращает целое число от 0 до 11. Если вы хотите отформатировать его правильно, вы можете проверить:

Форматировать дату JavaScript как гггг-мм-дд