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'}}