ホームページ  >  記事  >  ウェブフロントエンド  >  JSのディープコピーとシャローコピーの違いは何ですか

JSのディープコピーとシャローコピーの違いは何ですか

WBOY
WBOYオリジナル
2024-02-18 10:26:06381ブラウズ

JSのディープコピーとシャローコピーの違いは何ですか

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}

上記のコードでは、obj1obj2 A に代入することで実装しています。浅いコピー。 obj1age 属性が変更されると、obj2age 属性も変更されます。これは、これらが同じメモリ アドレスを指しているためです。 。

次に、ディープ コピーの例を見てみましょう:

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 のディープ コピーを実装します。 obj1age 属性が変更されても、obj2age 属性は変更されません。これは、これら 2 つが完全に独立しているためです。物体。

要約すると、浅いコピーはオブジェクトの参照アドレスをコピーするだけですが、深いコピーは完全に独立したコピーを作成します。ディープ コピーは、コピー オブジェクトを変更するときに元のオブジェクトが影響を受けないようにすることができ、ネスト構造を持つオブジェクトのコピーに適しています。なお、実際の開発においては、ディープコピーにより大きなパフォーマンスオーバーヘッドが発生する可能性があるため、実情に応じて適切なコピー方法を選択する必要があります。

以上がJSのディープコピーとシャローコピーの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。