JavaScript踩过的坑---深复制和浅复制

深复制和浅复制

JavaScript中针对Object, Array这样的复杂对象的复制都是浅复制,浅复制是对对象地址的复制,也就是说新对象和原对象都是访问同一块内存地址,修改其中一个对象的属性,则另一个对象的属性也会改变。相反,深复制则是开辟新的内存空间,也就是两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

代码实现
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//object深度复制,规避js原有的引用传递
public object_clone(source: Object): Object {
let data: Object = {};
for (let key in source) {
if (source[key] == null) {
continue;
}
if (this.getType(source[key]) == 'object') {
data[key] = this.object_clone(source[key]);
}
else if (this.getType(source[key]) == "array") {
data[key] = this.arr_clone(source[key]);
}
else {
data[key] = source[key];
}
}
return data;
}

//arr深度复制,对所有复杂arr均有效,规避js原有的引用传递
public arr_clone(source) {
let destination: any = [];
for (let key in source) {
let p = parseInt(key);
if (this.getType(source[p]) == "array") {
destination[p] = [];
arguments.callee(destination[p], source[p]);
}
else if (this.getType(source[p]) == "object") {
destination[p] = {};
destination[p] = this.object_clone(source[p]);
}
else {
destination[p] = source[p];
}
}
return destination;
}

private getType(o) {
let _t;
return ((_t = typeof (o)) == "object" ? o == null && "null" || Object.prototype.toString.call(o).slice(8, -1) : _t).toLowerCase();
}

可将此方法写入工具类中,方便使用时调用