JavaScriptのDate.prototype.setDate()でハマった
詰まった箇所
ある範囲の日付の一覧を作るために、以下の処理をした。
const firstDate = new Date(2000, 0, 1)
const currentDate = new Date()
for (let date = firstDate; date <= currentDate; date.setDate(date.getDate() + 1)) {
// 処理
}
console.log(firstDate) // 最初のfirstDateではなくなっている!
すると、for文を抜けると最初に定義したfirstDate
の中身が変わってしまっていた!
解決方法
for文のlet date = new Date(firstDate.getDate())
で新しいDate
オブジェクトを作成するようにして解決した。
const firstDate = new Date(2000, 0, 1)
const currentDate = new Date()
for (let date = new Date(firstDate.getDate()); date <= currentDate; date.setDate(date.getDate() + 1)) {
// 処理
}
console.log(firstDate) // もとのfirstDateのまま!
原因
let date = firstDate
で変数date
にはfirstDate
と同じオブジェクトの参照値が代入される。
しかし、date.setDate(date.getDate() + 1)
でそのオブジェクトの日付相当のプロパティの値が変わってしまうので、同じオブジェクトの参照値が代入されているfirstDate
の中身が変わってしまったように見えていたためだった。
おしまい
このあたりのJavaScriptの「参照渡しのようなもの」についての解説と考え方については以下のQiitaの記事が参考になった。
JavaScript(TypeScript)を雰囲気で書いていたのでハマってしまった。