深いレプリケーションと浅いレプリケーション

1288 ワード

浅いレプリケーション
浅いレプリケーションとは、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]";
    }
}