JavaScriptの浅いコピーVS深いコピー
2246 ワード
私たちはよくコピー対象の機能を使いますが、コピーは和深で2種類コピーします.この文章は2つの方面を言い直すことができます.
1:何が薄いコピーですか?上述した直後に、Bオブジェクトの属性が配列またはオブジェクトである場合、コピーは、Aオブジェクトの同名属性をBオブジェクトの属性に向けるメモリアドレスであり、copyの目的を達成する.このようなやり方では、Bオブジェクトの属性を変更すると、Aオブジェクトのこの属性も変更されます.これは同じメモリアドレスを指すためです.
私たちは直接例を見ます.
2:深度コピーの実現メカニズムは、浅いコピーとは異なり、ソースオブジェクトの属性がオブジェクトまたは配列の場合、深度コピーは対象となるオブジェクトのために新しいメモリアドレスを開き、ソースオブジェクト属性の値を対象とするオブジェクトに1つずつコピーし、直接に同じセグメントのメモリアドレスを指すのではない.コードの実現を見に来ました.
深度コピーは完璧に見えるが、ソースオブジェクトの階層が深いと、性能の問題に直面する.だから実際の使用では、自分のニーズに合わせて、薄いコピーを使うか、それとも、深くコピーするかを選択します.
1:
2:
コピーして、私達はよくAオブジェクトの属性copyをBオブジェクトに使うので、BオブジェクトはAオブジェクトの属性を持っています.Bオブジェクトの属性は、基本的なデータタイプではなく、配列またはオブジェクトである場合、和深のコピーの浅い違いが現れます.具体的には、以下の説明を参照してください.1:何が薄いコピーですか?上述した直後に、Bオブジェクトの属性が配列またはオブジェクトである場合、コピーは、Aオブジェクトの同名属性をBオブジェクトの属性に向けるメモリアドレスであり、copyの目的を達成する.このようなやり方では、Bオブジェクトの属性を変更すると、Aオブジェクトのこの属性も変更されます.これは同じメモリアドレスを指すためです.
私たちは直接例を見ます.
function shallowCopy(origin, destination) {
for (let i in origin) {
if (origin.hasOwnProperty(i)) {
destination[i] = origin[i];
}
}
return destination;
}
let origin = {age: 20, name: {firstName: 'nana'}};
let destination = {};
let result = shallowCopy(origin, destination);
console.log(result.name.firstName); // 'nana'
result.name.firstName = 'Lian';
console.log(origin.name.firstName); // 'Lian'
上は浅いコピーの実現です.私たちは、name属性がオブジェクトであるため、浅いコピーの実現メカニズムによって、resultのname属性を変更した後、orignオブジェクトのname属性も影響されていることを見ることができます.深度コピーはどうやって作ったのか見てみます.2:深度コピーの実現メカニズムは、浅いコピーとは異なり、ソースオブジェクトの属性がオブジェクトまたは配列の場合、深度コピーは対象となるオブジェクトのために新しいメモリアドレスを開き、ソースオブジェクト属性の値を対象とするオブジェクトに1つずつコピーし、直接に同じセグメントのメモリアドレスを指すのではない.コードの実現を見に来ました.
function deepCopy(origin, destination) {
for(let i in origin){
if(typeof origin[i] === 'object'){
if(origin[i].constructor === 'Array'){
destination[i] = [];
}else{
destination[i] = {};
}
deepCopy(origin[i], destination[i]);
}else{
destination[i] = origin[i];
}
}
return destination;
}
let destination = {class: '1-1'};
let origin = {age: 22, name: {firstName: 'nana'}};
let result = deepCopy(origin, destination);
console.log(result.name.firstName); // 'nana'
result.name.firstName = 'Lian';
console.log(result.name.firstName); // 'Lian'
console.log(origin.name.firstName);// 'nana'
深度コピーを使用して属性をオブジェクトまたは配列のオブジェクトとしてコピーする場合、結果オブジェクトの属性値を変更すると、ソースオブジェクトの同名属性は変更されません.深度コピーは完璧に見えるが、ソースオブジェクトの階層が深いと、性能の問題に直面する.だから実際の使用では、自分のニーズに合わせて、薄いコピーを使うか、それとも、深くコピーするかを選択します.