【JavaScript】日付のデータを渡す時、=で渡してはならない理由
日付データ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で日付を扱うときは注意が必要だ。