js实现对象深拷贝方法一
//js实现对象深拷贝方法一
//initalObj原始对象 finalObj拷贝对象
function deepClone(initalObj,finalObj){
var obj = finalObj || {};
for(var i in initalObj) {
// 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
var prop = initalObj[i];
if(prop === obj){
continue;
}
if(typeof prop === 'object'){
//如果数据类型是引用类型
obj[i] = (prop.constructor === Array)?[]:{};
//递归
arguments.callee(prop,obj[i]);
}else{
//如果数据类型是基本类型
obj[i] = prop;
}
}
return obj;
}
var str = {};
var obj = {a:{a:'hello',b:21}};
deepClone(obj,str);
console.log(str.a); //{a: "hello", b: 21}
str.a.b = 22;
console.log(str.a.b); //22
console.log(obj.a.b); //21
js实现对象深拷贝方法二
//js实现对象深拷贝方法二
function deepClone2(obj){
//判断数据类型是否为引用类型
if(!obj || !(obj instanceof Object) || (typeof obj =="function")){
return obj || undefined;
}
var constructor = obj.constructor;
var newobj = new constructor();
for(var key in obj) {
if(obj.hasOwnProperty(key)) {
newobj[key] = deepClone2(obj[key]);//递归
}
}
return newobj;
}
var father = {
a:'a',
b:{
a:'ba',
b:123
},
c:function(){alert("c");},
e:undefined
}
var child = deepClone2(father);
console.log(child); //{a: "a", b: {a:'ba',b:123}, c: ƒ(){alert("c");}, e: undefined}
child.b.b = 345;
console.log(child.b.b); //345
console.log(father.b.b); //123
js实现对象深拷贝方法三
//直接使用var newObj = Object.create(oldObj),可以达到深拷贝的效果
function deepClone3(initalObj,finalObj){
var obj = finalObj || {};
for(var i in initalObj){
// 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
var prop = initalObj[i];
if(prop === obj){
continue;
}
//如果数据类型是引用类型
if(typeof prop ==='object'){
obj[i] = (prop.constructor === Array) ? []:Object.create(prop);
}else{
//如果数据类型是基本类型
obj[i] = prop;
}
}
return obj;
}
var obj1 = {
a:'a',
b:{
a:'ba1',
b:111
},
c:function(){alert("c")},
d:undefined
}
var newobj1 = {};
deepClone3(obj1,newobj1);
console.log(newobj1);//{a: "a", b: {a:'ba1',b:111}, c: ƒ(){alert("c");}, e: undefined}
newobj1.b.b = 666;
console.log(newobj1.b.b); //666
console.log(obj1.b.b); //111