概念

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象共享同一块内存。而深拷贝会另外创建一个一模一样的新对象,新对象跟原对象不共享内存,修改新对象不会更改原对象。


JSON.parse()、JSON.stringify()

这种方法存在一个问题:能正确处理的对象只有 Number、String、Array 等能够被 JSON 表示的数据结构,因此像函数、undefined、正则表达式、引用这种不能被 JSON 表示的类型将不能被正确处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let obj = {
name: 'LqZww',
age: 18,
like: {
game: 'TLBB',
ear: 'rou'
},
arr: [1, 2]
};

let deepClone = JSON.parse(JSON.stringify(obj));
deepClone.name = 'lq';
deepClone.like.game = 'LOL';
console.log(obj); // {name: "LqZww", age: 18, like: {…}, arr: Array(2)}
console.log(deepClone); // {name: "lq", age: 18, like: {…}, arr: Array(2)}
console.log(obj === deepClone); // false

for…in + 递归

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
let obj = {
name: 'LqZww',
age: 18,
like: {
game: 'TLBB',
ear: 'rou'
},
arr: [1, 2]
};

function deepClone(object) {
let object2
if (!(object instanceof Object)) {
return object
} else if (object instanceof Array) {
object2 = []
} else if (object instanceof Function) {
object2 = eval(object.toString())
} else if (object instanceof Object) {
object2 = {}
}
for (let key in object) {
object2[key] = deepClone(object[key])
}
return object2
}

var obj2 = deepClone(obj)
obj2.name = 'lq';
obj2.like.game = 'LOL';
console.log(obj) // {name: "LqZww", age: 18, like: {…}, arr: Array(2)}
console.log(obj2) // {name: "lq", age: 18, like: {…}, arr: Array(2)}
console.log(obj === obj2) // false

Github - 详细代码