1.浅拷贝及深拷贝的介绍

浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用(这时引用更改,其拷贝值也会跟着更改)

深拷贝是拷贝多层,每一级别的数据都会拷贝出来;

浅拷贝的时候如果数据是基本数据类型,那么就如同直接赋值那种,会拷贝其本身,如果除了基本数据类型之外还有一层对象,那么对于浅拷贝而言就只能拷贝其引用,对象的改变会反应到拷贝对象上;但是深拷贝就会拷贝多层,即使是嵌套了对象,也会都拷贝出来。

2.浅拷贝的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script>
var obj = {
name:'小蚂蚁',
age: 26,
sex:'male',
arr:[1,2,3]
}
var obj1 = {};
function clone(origin,target){
var target = target ||{};
for(var prop in origin){
target[prop] = origin[prop];
}
return target;
}
clone(obj,obj1);
</script>

3.深拷贝的实现

1
2
3
4
5
1.遍历对象 for(var prop in obj)
2.判断是不是原始值 typeof() object
3.判断是数组还是对象 instanceof Object.prototype.toString.call constructor
4.建立相应的数组或对象
5.递归实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<script>
var obj = {
name:'小蚂蚁',
age:12,
arr:[1,2,3,4]
}
var obj1 = {};
function deepClone(origin,target){
var target = target ||{};
var toStr = Object.prototype.toString;
var arrStr = '[object Array]';

for(var prop in origin){
if(origin.hasOwnProperty(prop)){//避免拿原型链上的属性
if(origin[prop]!=="null"&&typeof(origin[prop])=='object'){//引用值
if(toStr.call(origin[prop])==arrStr){
target [prop] = [];
} else{
target[prop] = {}
}
deepClone(origin[prop],target[prop])
}else{//原始值
target[prop] = origin[prop];
}
}
}
return target;
}
</script>