Javascriptオブジェクトの深浅コピー

2930 ワード

開門して山を見て、ある人は対象の複製を深くコピーして浅い複製にして、ある人は深くコピーして浅いコピーをコピーすると言います.実は全部コピーです
深度コピー(再帰的に複製し、すべての階層を複製し、独立したコピー、完全に元のオブジェクト属性とは無関係のコピー)は対象に戻ります.着信先:一つ.条件:JSONの安全なオブジェクトは、JSON文字列に順番に並べられ、新しい文字列として解析できます.深度コピーアルゴリズム:
function deepCopy(data){
    let memory = null;
    const type = Object.prototype.toString.call(data);
    if (type === "[object Array]"){
        memory = []
        for (let i=0 ;i{
            memory[key] = data[key]
        })
    }else{
        return data;
    }
    return memory;
}
jQuery深コピー:var copiedObject = jQuery.extend(true, {}, originalObject)S 6ディープコピー:var copiedObject= JSON.parse(JSON.stringify(originalObject));深度コピーは再帰的に複製され、新たに複製されたオブジェクトと元のオブジェクトは完全に独立した二つのオブジェクトであり、それらは異なるメモリアドレスを指し、setをすると相手に影響を与えない.
浅いコピー(1回のコピー、最高レベルのコピー、参照コピー、元のオブジェクト属性に基づくコピー)は、オブジェクトに戻ります.着信先:1つ以上.条件:なし
jQuery浅いコピー:var copiedObject = jQuery.extend({}, originalObject)浅いコピー:var copiedObject = Object.assign({},originalObject)S 7浅いコピー:var copiedObject = {...originalObject}浅いコピーアルゴリズム:
  function shallowCopyObj(original){
        let copy = {}
        Object.keys(original).forEach(key=>{
            copy[key] = original[key]
        })
        return copy
    }
javascriptの対象は住所を保存しているので、浅い複製の対象は元の対象と同じメモリアドレスを指しています.引用コピーに属し、setをすると相手に影響を与えます.
実験:①通常属性の修正:深コピーと浅いコピーはいずれも対象のコピーを満足させることができます.一般的な属性とは、value値がArayではなく、Objectタイプのデータタイプ、つまりNumber、String、Booleanなどの基本的なデータタイプです.原因:基本データタイプは値伝達に属する.
var obj = {foo:1};
var deepCopyObj = JSON.parse(JSON.stringify(obj));
deepCopyObj.foo = 2;
console.log("obj.foo:",obj.foo);//1
console.log("deepCopyObj.foo:",deepCopyObj.foo);//2
var obj = {foo:1};
var shallowCopyObj = Object.assign({},obj);
shallowCopyObj.foo = 2;
console.log("obj.foo:",obj.foo);//1
console.log("shallowCopyObj.foo:",shallowCopyObj.foo);//2
②高級属性補正:対象のコピーを深くコピーし、浅いコピーは元の配列に影響します.高級属性とは、Aray、Objectのデータタイプのことです.原因:基本データの種類は引用伝達に属する.
var obj = {foo:1,bar:{baz:1}};
var deepCopyObj = JSON.parse(JSON.stringify(obj));
deepCopyObj.bar.baz = 2;
console.log("obj.bar.baz:",obj.bar.baz);//1
console.log("deepCopyObj.bar.baz:",deepCopyObj.bar.baz);//2
var obj = {foo:1,bar:{baz:1}};
var shallowCopyObj = Object.assign({},obj);
shallowCopyObj.bar.baz = 2;
console.log("obj.bar.baz:",obj.bar.baz);//2 Attention!
console.log("shallowCopyObj.bar.baz:",shallowCopyObj.bar.baz);//2
constも変数のアドレスをそのまま維持する操作という印象がありますが、es 6のletとconstは対象の深浅コピーに影響がありますか?
つまり上のコードのvarをletとconstに置き換えます.
実験結果はletとconstが深い浅いコピーの結果に影響しないことであり、letはブロック作用領域を強調するので、constは変数全体のアドレス空間の不変性を強調する.
対象の深浅コピーについては、しばらくここを探してみて、新たな発見があったら補充します.
読んでくれてありがとうございます.