Js対象の浅いコピーは和深でコピーします.

1956 ワード

一、以下の方式は浅いコピーではないです.
    var obj = {
        name: '  ',
        arr: [1,2,3]
    }

    function copy(obj){
        var Obj = obj;
        return Obj;
    }

    var obj1 = copy( obj );

    obj1.name = 'lisi';

    console.log( obj );    // name : 'lisi'
    console.log( copy( obj ) );   // name : 'lisi'
 上の二つの変数は同じアドレスを指します.実は同じ相手です.
 
二、浅いコピー
    var obj = {
        name: '  ',
        arr: [1,2,3]
    }

    function shadowCopy(obj1){

        var obj2 = {};

        for( var k in obj1 ){
            obj2[k] = obj1[k]; //     obj1        obj2;
                               //            ,       .
                               // obj1.arr obj2.arr         
        }

        return obj2;
        
    }

    var obj1 = shadowCopy( obj );

    obj1.name = 'lisi';
    obj.arr[0] = 111;

    console.log( obj );    // name : 'zhangsan', arr: [111,2,3]
    console.log( obj1 );   // name : 'lisi', arr: [111,2,3]
上の考えは循環バーObj 1の属性を通してすべてobj 2にコピーします.ただし、属性がオブジェクトや配列であれば、属性のkeyは同じオブジェクトを指しています.二つのオブジェクトにはまだ属性があります.共用メモリです.これは浅いコピーです.
三、ディープコピー(再帰的に利用して、深度コピーを実現する)
    var obj = {
        name: '  ',
        arr: [1,2,3]
    }
    var Obj = {};

    function deepCopy(obj1, obj2){

        var obj2 = obj2 || {};
        
        for( var key in obj1 ){
            if( typeof obj1[key] == 'object' ){
                obj2[key] = ( obj1[key].constructor === Array ) ? [] : {};
                deepCopy( obj1[key], obj2[key]);
            } else{
                obj2[key] = obj1[key];
            }
        }
    
        return obj2;
        
    }

    var obj1 = deepCopy( obj, Obj );

    obj1.name = 'lisi';
    obj.arr[0] = 111;

    console.log( obj );    // name : 'zhangsan', arr: [1,2,3]
    console.log( obj1 );   // name : 'lisi', arr: [111,2,3]