深いレプリケーションと浅いレプリケーション
1288 ワード
浅いレプリケーション
浅いレプリケーションとは、1つのオブジェクト(ソースオブジェクト)のプロパティを別のオブジェクト(ターゲットオブジェクト)に直接レプリケーションすることです.もちろん、プロパティにリファレンスタイプが含まれている場合、レプリケーションされたのはリファレンスアドレスだけで、レプリケーションされた2つのオブジェクトは同じオブジェクトと関数を共有します.
深くコピー
浅いレプリケーションの問題を解決するために、深いレプリケーションがあり、互いに干渉されずに同じオブジェクトをレプリケーションすることができます.
でもこの方法はArrayに使われていますisArray、この方法は互換性の問題があるので、使用するときは互換性を処理したほうがいいです.これは私の前の文章で処理方法について言及しました.
浅いレプリケーションとは、1つのオブジェクト(ソースオブジェクト)のプロパティを別のオブジェクト(ターゲットオブジェクト)に直接レプリケーションすることです.もちろん、プロパティにリファレンスタイプが含まれている場合、レプリケーションされたのはリファレンスアドレスだけで、レプリケーションされた2つのオブジェクトは同じオブジェクトと関数を共有します.
var obj = {
a:1,
b:function(){
console.log(this.a);
},
c:[10,11,12]
};
function slightCopy(targetO, sourceO){
for(var k in sourceO){
if(!targetO[k]){ // ,
targetO[k] = sourceO[k]
}
}
return targetO;
}
var o = slightCopy({}, obj);
console.log(o);
深くコピー
浅いレプリケーションの問題を解決するために、深いレプリケーションがあり、互いに干渉されずに同じオブジェクトをレプリケーションすることができます.
function deepCopy(targetO, sourceO){
targetO = targetO || {};
for(var k in sourceO){
if(typeof sourceO[k] == "object"){
targetO[k] = Array.isArray(sourceO[k])? []: {}; //
deepCopy(targetO[k], sourceO[k]);
}else{
targetO[k] = sourceO[k];
}
}
}
でもこの方法はArrayに使われていますisArray、この方法は互換性の問題があるので、使用するときは互換性を処理したほうがいいです.これは私の前の文章で処理方法について言及しました.
if(typeof Array.isArray != "function") {
Array.isArray = function(obj){
return Object.prototype.toString.call(obj) == "[object Array]";
}
}