okaryo.log

JavaScriptのDate.prototype.setDate()でハマった | okaryo.log

JavaScriptのDate.prototype.setDate()でハマった

    #JavaScript

詰まった箇所

ある範囲の日付の一覧を作るために、以下の処理をした。

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に参照渡し/値渡しなど存在しない

JavaScript(TypeScript)を雰囲気で書いていたのでハマってしまった。


関連記事
最新記事
プロモーション

This site uses Google Analytics.