JavaScript深浅复制

首先是这段代码

1
2
3
4
5
6
7
8
var a = {
id: 1,
name: "asd"
};
var b = a;
b.id = 2;
b.name = "qwe";
console.log(a);

这段代码的输出结果是

1
2
id: 2
name: "qwe"

为什么会是

首先是这段代码

1
2
3
4
5
6
7
8
var a = {
id: 1,
name: "asd"
};
var b = a;
b.id = 2;
b.name = "qwe";
console.log(a);

这段代码的输出结果是

1
2
id: 2
name: "qwe"

为什么会是这样呢,明明改变的b,但是a也改变了,原因就是浅复制。

1
var b = a;

这段代码会把a的地址复制给b,所以b就是a的引用,所以修改了b就会导致a也变化了。
同样数组Array也是这样的。
那这个时候该怎么办呢?
可以使用深复制

1
2
3
4
5
6
function clone(obj) {
if (obj instanceof Object) {
return newObj = JSON.parse(JSON.stringify(obj));
}
throw "类型错误";
}

这是一种最简单的深复制,但是这种方式要求必须是json安全的,就是可以安全的转换为json对象。
所以如果想要完备的深复制
可以参考这篇文章

深入剖析 JavaScript 的深复制