知識のアウトプットをするブログ

なんでもブログに書き記す

【JavaScript】日付のデータを渡す時、=で渡してはならない理由

f:id:seisyo58:20181113110805j:plain
日付データAを変数Bに渡して、Bをいじったら、Aまで変更された話。

JavaScriptの日付データ

普通にコピーしたら、以下のようになる。

  var timeA = new Date("Tue Nov 13 10:00:00 GMT+09:00 2018");
  Logger.log(timeA); // => Tue Nov 13 10:00:00 GMT+09:00 2018
  
  var timeB = timeA;
  Logger.log(timeB); // => Tue Nov 13 10:00:00 GMT+09:00 2018
  
  timeB.setDate(timeB.getDate()+1);//一日後にする
  Logger.log(timeB); // => Wed Nov 14 10:00:00 GMT+09:00 2018
  
  Logger.log(timeA); // => Wed Nov 14 10:00:00 GMT+09:00 2018 <-???

日付データを渡すと、渡されるのはポインタらしい。ポインタなので、timeBを変更すれば、timeAも変更されてしまう。

回避方法

timeAを元にした日付データを新しく生成すればいい。

 //var timeB = timeA;
 var timeB = new Date(timeA);

つまり、こうなる

  var timeA = new Date("Tue Nov 13 10:00:00 GMT+09:00 2018");
  Logger.log(timeA); // => Tue Nov 13 10:00:00 GMT+09:00 2018
  
  var timeB = new Date(timeA);
  Logger.log(timeB); // => Tue Nov 13 10:00:00 GMT+09:00 2018
  
  timeB.setDate(timeB.getDate()+1);//一日後にする
  Logger.log(timeB); // => Wed Nov 14 10:00:00 GMT+09:00 2018
  
  Logger.log(timeA); // => Tue Nov 13 10:00:00 GMT+09:00 2018 <-timeAは変更されていない

まとめ

JavaScriptでは、常にポインタが渡されるわけではなく、たとえば、文字列などは、中身がコピーされるだけで、ポインタが渡されるわけではない。日付データなど、いくつかのデータだけがポインタで渡されるらしい。JavaScriptで日付を扱うときは注意が必要だ。