不知道各位有没有玩过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没关系。