JS のディープ コピーとシャロー コピーの違いは何ですか?具体的なコード例が必要です
JavaScript では、オブジェクトのコピーは 2 つのタイプに分類されます。浅いコピーと深いコピー。浅いコピーはオブジェクトの参照アドレスのみをコピーしますが、深いコピーは完全に独立したコピーを作成します。
浅いコピーは、元のオブジェクトの参照アドレスを新しいオブジェクトにコピーすることであり、それらは同じメモリ空間を指します。いずれかのオブジェクトのプロパティが変更されると、他のオブジェクトの対応するプロパティも変更されます。これは、同じメモリ アドレスを共有しているためです。
ディープ コピーとは、まったく新しいオブジェクトを作成し、元のオブジェクトのすべての属性を新しいオブジェクトに 1 つずつコピーすることです。新しいオブジェクトと元のオブジェクトは相互に影響を与えません。一方のオブジェクトのプロパティを変更しても、もう一方のオブジェクトのプロパティは影響を受けません。
以下では、具体的なコード例を通して、浅いコピーと深いコピーの違いを説明します。
まず、浅いコピーの例を見てみましょう:
let obj1 = {name: "Alice", age: 20}; let obj2 = obj1; obj1.age = 21; console.log(obj1); // {name: "Alice", age: 21} console.log(obj2); // {name: "Alice", age: 21}
上記のコードでは、obj1
を obj2
A に代入することで実装しています。浅いコピー。 obj1
の age
属性が変更されると、obj2
の age
属性も変更されます。これは、これらが同じメモリ アドレスを指しているためです。 。
次に、ディープ コピーの例を見てみましょう:
function deepClone(obj) { if (obj === null || typeof obj !== 'object') { return obj; } let clone = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { clone[key] = deepClone(obj[key]); } } return clone; } let obj1 = {name: "Alice", age: 20}; let obj2 = deepClone(obj1); obj1.age = 21; console.log(obj1); // {name: "Alice", age: 21} console.log(obj2); // {name: "Alice", age: 20}
上記のコードでは、ディープ コピーを実装するための deepClone
関数を定義します。この関数は、最初に受信パラメータが null であるかオブジェクト タイプではないかを判断し、そうである場合は直接戻り、そうでない場合は受信オブジェクトと同じタイプの空のオブジェクト clone
を作成します。次に、元のオブジェクトのプロパティを走査し、deepClone
関数を再帰的に呼び出して各プロパティを深くコピーし、対応する clone
プロパティに割り当てます。最後に、新しいオブジェクト clone
が返されます。
deepClone
関数を使用して、obj1
のディープ コピーを実装します。 obj1
の age
属性が変更されても、obj2
の age
属性は変更されません。これは、これら 2 つが完全に独立しているためです。物体。
要約すると、浅いコピーはオブジェクトの参照アドレスをコピーするだけですが、深いコピーは完全に独立したコピーを作成します。ディープ コピーは、コピー オブジェクトを変更するときに元のオブジェクトが影響を受けないようにすることができ、ネスト構造を持つオブジェクトのコピーに適しています。なお、実際の開発においては、ディープコピーにより大きなパフォーマンスオーバーヘッドが発生する可能性があるため、実情に応じて適切なコピー方法を選択する必要があります。
以上がJSのディープコピーとシャローコピーの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。