— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
浅いコピー
浅いコピーは、オブジェクトのビット単位のコピーです。 元のオブジェクト内の値の正確なコピーを持つ新しいオブジェクトが作成されます。 オブジェクトのフィールドのいずれかが他のオブジェクトへの参照である場合、参照アドレスのみがコピーされます。
ディープコピー
ディープコピーは、すべてのフィールドをコピーし、フィールドが指す動的に割り当てられたメモリのコピーを作成します。, 詳細コピーは、オブジェクトが参照先のオブジェクトと一緒にコピーされるときに発生します。
浅いコピー:Xへの参照のコピーをYにします。Xのアドレスのコピーと考えてください。 したがって、XとYのアドレスは同じになります、つまり、それらは同じメモリ位置を指しています。
ディープコピー:Xのすべてのメンバーのコピーを作成し、Yに異なるメモリ位置を割り当て、コピーしたメンバーをYに割り当ててディープコピーを実現します。 このようにして、Xが消えた場合、Yはメモリ内でまだ有効です。,
使用する正しい用語はクローニングであり、両方が完全に同じですが、まだ異なっていることがわかります(つまり、メモリ空間に二つの異なる場所とし
この例を考えてみましょう。
var employeeDetailsOriginal = { name: 'Manjula', age: 25, Profession: 'Software Engineer' };
元の値を変更しても、いつでも元の値に戻ることができるように、この複製を作成したいとしましょう。,
私はこれを行うことができます:
var employeeDetailsDuplicate = employeeDetailsOriginal; //Shallow copy!
値を変更する場合:
employeeDetailsDuplicate.name = 'NameChanged';
このステートメントは、浅いコピーまたはvar employeeDetailsOriginalへの参照を持っているため、employeeDetailsOriginalから名前も変更されます。 これは、元のデータも失われていることを意味します。
ただし、元のemployeeDetailsOriginal変数のプロパティを使用して新しい変数を作成すると、詳細コピーを作成できます。
employeeDetailsDuplicateを変更すると、次のようになります。,これはemployeeDetailsDuplicateにのみ影響し、employeeDetailsOriginalには影響しません。
図式の例
それでは、javascriptオブジェクトを参照ではなく新しい変数にコピーするにはどうすればよいですか?
あなたの唯一の選択肢は、何らかの形でオブジェクトを複製することです。
オブジェクトをディープクローンする純粋なjavascriptメソッド
Leave a Reply