深拷贝和浅拷贝最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用,
- 深拷贝在计算机中开辟了一块内存地址用于存放复制的对象,
- 而浅拷贝仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅拷贝出来的对象也会相应改变。
深拷贝的实现:
1.通过递归解决
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,所属的类没了.
4、Object.assign()处理一层的深度拷贝
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]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。