JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptでオブジェクトをディープクローン(深いコピー)する最も効率的な方法とは?

ディープコピー(深いコピー)とは、コピー対象のオブジェクト内に存在するすべてのネストされたオブジェクトを再帰的に複製することを指します。元のオブジェクトとコピーの間で何も参照を共有しないため、完全に独立した複製が作られます。

JSONを使った最も手軽な方法

最もシンプルなのは、JSON.stringify()でオブジェクトをJSON文字列に変換し、JSON.parse()で再びJavaScriptオブジェクトへ戻す方法です。ただしこの方法には、メソッド(関数)やundefined、Symbolなどをコピーできないという重要な制限がある点に注意が必要です。

コード例

let obj = {
    foo: 1,
    bar: { baz: 'test' }
}
let newObj = JSON.parse(JSON.stringify(obj));
obj.bar.baz = 20;
console.log(obj);
console.log(newObj);

実行結果

{ foo: 1, bar: { baz: 20 } }
{ foo: 1, bar: { baz: 'test' } }

この例では、元のobjの値を変更してもnewObjには一切影響していません。これはディープコピーが正常に行われたことを示しています。

よりモダンな選択肢:structuredClone()

近年のブラウザやNode.js(v17以降)では、組み込み関数structuredClone()を利用できます。この方法はJSON変換と異なり、DateオブジェクトやMap、Setなどの特殊な型もそのまま複製できるため、より安全で推奨されるアプローチです。

const newObj = structuredClone(obj);

オブジェクトの構造や扱うデータの種類に応じてこれらの方法を使い分けることで、意図しないデータ破損を防ぎながら、効率的かつ確実にオブジェクトを複製できます。

  1. JavaScriptのErrorクラスは拡張できる?カスタムエラーを作成する最適な方法

    JavaScriptでは、組み込みのErrorクラスを継承することで、独自のカスタムエラーを作成できます。最も推奨される方法は、ES2015(ES6)以降のclass構文とextendsキーワードを使って、標準のErrorクラスを拡張した新しいカスタムエラークラスを定義することです。カスタムエラーを利用すれば、エラーの種類を名前で判別したり、エラーコードなどの独自のプロパティを持たせたりできるため、アプリケーションの規模が大きくなっても、柔軟で分かりやすいエラーハンドリングを実現できます。カスタムエラーの実装例以下は、JavaScriptでErrorクラスを拡張するサンプルコードです。<

  2. JavaScriptでイベントを追加する最良の方法とは?addEventListener()の使い方を徹底解説

    任意の要素にイベントを追加する最良の方法は、addEventListener()メソッドを使用することです。このメソッドは、指定した要素に対してイベントリスナー(イベント発生時に実行される処理)を登録します。従来のonclick属性と異なり、1つの要素に複数のイベントハンドラを追加できるため、現代のWeb開発では標準的な手法とされています。 addEventListener()メソッドの基本構文 element.addEventListener(event, function, useCapture); event: 監視したいイベントの種類(例: 「click」「mouseover」「ke