js 深拷贝

1.正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,即那些能够被 json 直接表示的数据结构。
   

var newObj=JSON.parse(JSON.stringify(obj));


//也就是说,只有可以转成JSON格式的对象才可以这样用,像function没办法转成JSON。
var obj1 = { fun: function(){ console.log(123) } };
var obj2 = JSON.parse(JSON.stringify(obj1));
console.log(typeof obj1.fun); // 'function'
console.log(typeof obj2.fun); // 'undefined' <-- 没复制

2.通过递归复制

// 遍历对象 for(var i in obj)
//1.判断是不是原始值 typeof() object
//2.判断是数组还是对象 constructor instanceof toSting()
//3.建立相应的数组或对象
//4.递归
function deepClone(origin,target){
    var target=target?target:(origin.constructor === Array) ? [] : {};

    for(var i in origin){
        // 判断对象是否包含特定的自身(非继承)属性。
        if(!origin.hasOwnProperty(i)) continue;
        // 避免相互引用对象导致死循环,如origin.a = origin的情况
        if(origin[i] === target)  continue; 
        // 防止为null
        if(origin[i]&&typeof origin[i]=='object'){
            target[i]=origin[i] instanceof Array?[]:{};
            arguments.callee(origin[i],target[i]);//表示函数体本身,解耦和

        }else{
            target[i]=origin[i];
        }
    }
    return target;
}

  
var arr=[{name:'su'},[1,2,3],{asd:null}];
var newArr=deepClone(arr);
newArr[0].name='su123';

console.log(arr); //[{name:'su'},[1,2,3]]
console.log(newArr);//[{name:'su123'},[1,2,3]]

 

function deepClone(origin){
    var target=origin.constructor === Array ? [] : {};
    for(var i in origin){
        // 判断对象是否包含特定的自身(非继承)属性。
        if(!origin.hasOwnProperty(i)) continue;
        // 避免相互引用对象导致死循环,如origin.a = origin的情况
        if(origin[i] === target)  continue; 
        // 防止为null
        if(origin[i]&&typeof origin[i]=='object'){
            target[i]=arguments.callee(origin[i]);//表示函数体本身,解耦和
        }else{
            target[i]=origin[i];
        }
    }
    return target;
}

 

 // 判断数组与对象的三种方法
    var obj=[]||{};
    // constructor instanceof 
    console.log(obj.constructor==Array);
    // A instanceof B :A对象是不是B构造函数构造出来的->看A对象的原型链上 有没有B的原型
    console.log(obj instanceof Array);
    console.log(Object.prototype.toString.call(obj)=='[object Array]');

 

 3. jquery

var arr={name:'su',a:{b:'11'}};

//用于将一个或多个对象的内容合并到目标对象 $.extend( [deep ], target, object1 [, objectN ] )
var newArr=$.extend(true,{},arr); 

newArr.a.b='su123';

console.log(arr); //{name:'su',a:{b:'11'}}
console.log(newArr);//{name:'su',a:{b:'su123'}}

 

posted @ 2018-07-10 17:50  yuesu  阅读(610)  评论(0编辑  收藏  举报