深拷贝和浅拷贝

不知道各位有没有玩过DOTA,在DOTA里有两个英雄,地卜和猴子,地卜的所有的分身共用同一个生命,一旦一个分身死掉,地卜剩下的人全部死掉,而猴子的分身,每个分身都有自己命,一个分身没了没关系。

而浅拷贝就是地卜,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。

深拷贝会创造一个一模一样的对象。

var a = 10;
var b = a;
b = 20;
console.log(a); //10
console.log(b); //20
//修改a 的时候不会修改b
var obj1 = {
a: 10,
b: 20,
c: 30
};
var obj2 = obj1;
obj2.b = 100;
console.log(a);
//{a:10 , b:100 , c:30}
console.log(b);
//{a:10 , b:100 , c:30}
这里复制一份obj叫做obj2, 这里修改了obj2的b为100 同时也修改了obj1.b。 因为他们本来就是一个对象 这就是所谓的浅拷贝。

 

var boj1 = {a:10 , b:20 , c:30};
var obj2 = {a:boj1.a ,b:boj1.b , c:boj1.c }
obj2.b = 100;
console.log(obj1);
//{a:10 , b:20 , c:30}
console.log(obj2);
//{a:10 , b:100 , c:30}
这就是深拷贝 不会改到原来的obj1。

 

let obj1 = {a: 0,b: {c: 0}};
let obj2 = Object.assign({}, obj1);
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}


obj1.a = 1;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
因为obj2.a属于深拷贝


obj2.a = 2;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}}
一样因为obj2.a属于深拷贝

 


obj2.b.c = 3;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}} 

因为 Object.assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。

所以obj2.b.c属于浅拷贝,和obj1.b.c指向同一个内存空间。

obj4 = {a: 0,b: {c: 0}};
let obj3 = JSON.parse(JSON.stringify(obj4));
obj4.a = 4;
obj4.b.c = 4;
console.log(JSON.stringify(obj3));

这里JSON.parse把JSON.stringify(obj4)给深拷贝了。所以obj3和obj4没关系。

posted @ 2019-07-19 10:37  哭辽  阅读(149)  评论(0编辑  收藏  举报