2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

普段気にすることの無かった JavaScript の「参照渡し」(正確には「参照値という値渡し」?)に出くわした

Last updated at Posted at 2023-05-02

こんな事がありました

他の人が書いたGoogleAppsScriptのコードを見ていて(と書くことによって「私じゃないよ!」を強調したい下心が見えますね)、Dateオブジェクトを渡すとその1週間後(7日後)が日本の祝日かどうかを判定する関数 isHolidayNextWeek() がありました。

こんな感じで使われていました。

function main() {
  const date = new Date("2023-10-02") // 翌週の 2023-10-09 は スポーツの日です 
  if(isHolidayNextWeek(date)){
    console.log(`${Utilities.formatDate(date,"JST","yyyy-MM-dd")} の1週間後は祝日です`)
  }
}

function isHolidayNextWeek(date) {
  const nextWeekMonday = new Date(date.setDate(date.getDate() + 7));
  const calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  const count = calendar.getEventsForDay(nextWeekMonday).length;
  if (count) return true
  return false
}

main() の実行結果がこちら

2023-10-09 の1週間後は祝日です

…え。こちらの想定としては

2023-10-02 の1週間後は祝日です

でした。

これが参照渡しってやつか!!

JavaScript における「値渡し」「参照渡し」の説明は別のところで調べてもらうとして

  • プリミティブは値渡し
  • オブジェクトは参照渡し

のようです。

(2023-05-03追記: 正確には「JavaScriptには参照渡しは存在しない」ようです。私は「参照値という値渡し」という表現がピンと来ました。参照先)

今回の date は オブジェクト(Dateクラスのインスタンス?) なので main() の中の date と isHolidayNextWeek() の中のdate は 「同じものを参照している」ということ、、、なんだろうな。

function isHolidayNextWeek(date) {
  const nextWeekMonday = new Date(date.setDate(date.getDate() + 7)); // dateにsetしちゃダメ!
...

ここが date.setDate() なので、dateにsetしちゃってるのよね。だから main() の中のdateも7日後になっちゃってる、と。

これ、頭ではわかっててもうっかりやっちゃいそう。。。

こうすればいいよね

const nextWeekMonday = new Date(date.getFullYear(), date.getMonth(), date.getDate() + 7);

dateオブジェクトは変更しないで、dateから取得した値によって new Date() する、と。

これ、気をつけないと「A関数からB関数にオブジェクトを渡して、B関数の中でオブジェクトを変更しちゃうと、その変更にA関数からは気づけない」みたいなことになりますよね。

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?