JavaScriptで日付をコピーして計算すると、コピー元の日付も変わってしまう場合の対処法

JavaScriptで日付の処理をするとき、すでに設定してある開始日から30日後先の終了日を設定したいときがあります。
適当にささっと書いてしまったら少しつまづいたので、その時の対処法を備忘録として残しておきます。
うまくいかないパターン
うまくいかなかったのが下記のコードです。
やっていることは開始日を設定(実際には別の場所から取得)し、それを終了日の変数に一時的に入れてから、30日後に変更しているだけです。
ただ、この方法だと開始日も一緒に30日後に変わってしまいます。
// 開始日の設定
let startDate = new Date(2021, 4, 1);
// 終了日の設定
let endDate = startDate; // 一時的に開始日を入れる
endDate.setDate(endDate.getDate() + 30); // 開始日から30日後に変更原因は参照渡し
こちらの原因ですが、let endDate = startDate;のときに参照渡しになってしまっているのが原因です。
JavaScriptには「値渡し」と「参照渡し」があり、値渡しというのが直接の値を変数に渡しているもので、参照渡しはあくまでパスを渡しているだけです。
簡単に説明すると、本当に「endDate = startDate」の状態になってしまっているので、片方変えるともう片方も変わってしまう。リンクされたような状態になっているということです。
新しくDateオブジェクトを作成する
参照渡しになってしまっていた部分を、開始日の情報を元にしてnew Date()で作成すれば問題なく動作しました。
let endDate = new Date(startDate.getTime());全文は下記の通りです。
// 開始日の設定
let startDate = new Date(2021, 4, 1);
// 終了日の設定
let endDate = new Date(startDate.getTime()); // 一時的に開始日を入れる
endDate.setDate(endDate.getDate() + 30); // 開始日から30日後に変更参照渡しなのか値渡しなのかの差は、「あれ?なんか変なことになっている…」の原因になるので、変数周りで意図した値になっていない場合は疑ってみるようにしましょう。

gitignoreで特定ファイルをGitで無視する方法
JavaScriptのテンプレートリテラル内で条件分岐を行う方法
Visual Studio Codeの文字サイズやタブサイズの設定方法
Visual Studio Codeでパス補完機能を細かく設定して自分好みにできる拡張機能「Path Autocomplete」
Nuxt.jsの基本と最初のセットアップ「プロジェクトの作成と起動をするまでの流れ」
超軽量なコードエディタ 「Zed」をサブエディタとして活用する
JavaScriptで配列内から特定条件の要素を探す方法
手軽にコーディングの勉強ができるCodePenをもっと便利に使うための設定
Visual Studio CodeでToDoコメントを一覧で表示する拡張機能「Todo Tree」
gulpでSSI(サーバーサイドインクルード)を使用する「connect-ssi」
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
Neovimを使い始める最初の一歩として便利な「LazyVim」
ウェブサイトをmacOSアプリとしてラッピングする「Unite Pro」
Keyboard Maestroの「Macro Debugger」で複雑なマクロのデバッグを行う方法
無料版でも高機能なランチャーアプリ「Raycast」の基本機能と環境設定
OnyXでターミナルを使わずにmacOSの詳細設定を行う
軽量で高速なターミナルエミュレーター「Ghostty」の設定方法
Eagleで実現するクリエイティブ素材の簡単管理
かゆいところに手が届く「Supercharge」でMac環境を便利にカスタマイズする
Bartender 6で追加されたWidgets機能で自作メニューバーアイテムを簡単に作成する