【でぃーぷこぴー】

ディープコピー(深いコピー) とは?

💡 設計図から部品まですべて複製する「完全なクローン」
📌 このページのポイント
ディープコピー vs シャローコピー シャローコピー(浅いコピー) 元オブジェクト name: "太郎" addr: ●→ コピー name: "太郎" addr: ●→ ネストオブジェクト city: "東京" 同じ参照! ⚠ 片方を変更するともう片方も変わる ディープコピー(深いコピー) 元オブジェクト name: "太郎" addr: ●→ ネスト(元) city: "東京" コピー name: "太郎" addr: ●→ ネスト(複製) city: "東京" 別々のオブジェクト ✓ 互いに独立 — 変更の影響なし
ディープコピーとシャローコピーの違い
ひよこ ひよこ

いつディープコピーが必要になるの?

ペンギン先生 ペンギン先生

元のデータを絶対に壊したくないとき。たとえば「変更前の状態を保存してUndo機能を作る」「テストでオリジナルデータを汚さずにテスト用データを作る」といった場面。逆にネストがない単純なオブジェクトならシャローコピーで十分。

ひよこ ひよこ

structuredClone って何?

ペンギン先生 ペンギン先生

ブラウザNode.jsに組み込まれたネイティブのディープコピー関数。structuredClone(obj) と書くだけで完全なコピーが得られる。Dateや Map, Set もコピーできる。ライブラリ不要で使えるので、今はこれが第一選択。

ひよこ ひよこ

JSON.parse(JSON.stringify()) じゃダメなの?

ペンギン先生 ペンギン先生

シンプルなオブジェクトなら動くけど、関数は消える、undefinedは消える、Dateは文字列になる、循環参照はエラーになる、と制約が多い。structuredCloneならこれらの問題の大部分を解決してくれる。

ひよこ ひよこ

ディープコピーが必要になる実際の場面ってどんなとき?

ペンギン先生 ペンギン先生

Reduxなどの状態管理で「前の状態を壊さずに新しい状態を作る」ときによく必要になるよ。たとえばユーザーの設定オブジェクトを変更するとき、シャローコピーだとネストしたオブジェクトが元のデータと共有されていて、意図しない変更が起きるバグが生まれるんだ。実はReactの再レンダリング判定は参照の比較(===)で行われるから、ディープコピーで新しい参照を作ることでUIの更新をトリガーできる。ただし毎回ディープコピーするとパフォーマンスが悪いから、Immer.jsの「構造共有」のように変更部分だけ新しいオブジェクトを作る手法が実践的だよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
ディープコピーって出てきたら「ネストも含めて完全に独立したコピーを作る方法」と思えばだいたいOK!
📖 おまけ:英語の意味
「deep copy」 = 深いコピー
💬 deep は「深い」という意味で、データ構造の深い階層まですべてコピーすることから
← 用語集にもどる