关于对象的浅复制和深复制

之前面试的时候,面试官问了我第一个技术问题,什么是深复制,用代码实现一下深复制。
我一开始有点蒙圈,回答的不怎么好。只能算知道个大概,大家都知道Javascript里面数据类型分为两大类-基本类型和引用数据类型(对象即Object)。
如果是基本类型的话,直接赋值就相当于复制了。
如果是复杂数据类型的话,一方面是历史原因,当初内存老贵了,另一方面也是为了优化的关系,复制的数据都是赋值的内存地址,也就是说都是指向的同一个内存地址,节约内存空间~

1.基本类型的复制

基本类型:字符串、数字、布尔、null、undefined。
基本类型的复制,比如:

1
2
3
4
var a=1;
var b=a;
console.log(b);//1
console.log(typeof b);//number

2.引用类型的复制

引用类型:对象、数组、函数。

1
2
3
4
5
var c=[1,2,3]
var d=c;
console.log(d);//1,2,3
d.push(4);
console.log(c);//1,2,3,4

可以看到如果修改变量d,那边变量c的内容也会被修改,因为它们都指向同一个内存地址。那么解决这种情况的就是对象的深复制。
如果一个复杂数据类型的变量里面又含有另外一个复杂数据类型的变量,这种情况下面最合适的就是递归调用了。
深复制简单对象的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function deepCopy(obj,type){
var type = type || {};

for(var item in obj){
if(typeof obj[item]==='object'){
if(obj[item].constructor===Array){
type[item]=[];
}else{
type[item]={};
}
deepCopy(obj[item],type[item]);
}else{
type[item]=obj[item];
}
}
return type;
}