深拷贝和浅拷贝最根本的区别在因而否是真正获取了一个对象的复制实体,而不是引用,javascript
深拷贝的实现:
1.经过递归解决java
var a={a:23,b:[1,2,3,[5]],c:{name:'南京'}}; function deepCopy(initObj,finalObj) { var obj=finalObj||{}; for(var i in initObj){ var prop = initObj[i]; // 避免相互引用对象致使死循环,如initalObj.a = initalObj的状况 if(prop === obj) { continue; } if(typeof initObj[i]==='object'){ obj[i]=(initObj[i].constructor===Array)?[]:{}; // arguments.callee(initObj[i],obj[i]); deepCopy(initObj[i],obj[i]); }else{ obj[i]=initObj[i]; } } return obj; } var b=deepCopy(a); b['name']='武汉'; b.c.name='长江'; console.log(a); console.log(b);
2.使用Object.create数组
var a={a:23,b:[1,2,3,[5]],c:{name:'南京'}}; function deepCopy(initObj,finalObj) { var obj=finalObj||{}; for(var i in initObj){ var prop=initObj[i]; if(prop===obj){ continue; } if(typeof prop==='object'){ // obj[i]=prop.constructor==='Array'?[]:Object.create(prop); // obj[i]=prop.isPrototypeOf(Array)?[]:Object.create(prop); obj[i]=prop instanceof Array?[]:Object.create(prop); }else{ obj[i]=prop; } } return obj; } var b=deepCopy(a); b['name']='武汉'; b.c.name='长江'; console.log(a); console.log(b);
3.借助JSON函数
var a={a:23,b:[1,2,3,[5]],c:{name:'南京'},d:function () { console.log("hh"); }}; var b=JSON.parse(JSON.stringify(a)); b['name']='武汉'; b.c.name='长江'; console.log(a); console.log(b); console.log(a.d); console.log(b.d);
这种方法的缺点是没法复制函数,再就是原型链没了,对象就是object,所属的类没了.
四、Object.assign()处理一层的深度拷贝code
var a={name:'武汉',num:[1,2,3]}; var b=Object.assign({},a); b.name='南京'; console.log(a); console.log(b);
数组的拷贝,ES6有Array.from和...两种方法不会发生引用,js中的slice和concat对象
var a=[1,2]; var b=Array.from(a); b.push(3); var c=[...a]; c.push(4); var d=a.slice(0); d.push(-1); var e=a.concat([5]); console.log(a); //[1,2] console.log(b); //[1,2,3] console.log(c); //[1,2,4] console.log(d); //[1,2,-1] console.log(e); //[1,2,5]