问:
object.assign() 和 拓展运算符 是深拷贝还是浅拷贝?
回答:
object.assign()是浅拷贝

这里可以看出,sourceObj和targetObj共用深层的对象,当修改sourceObj的c的时候targetObj的c也修改了所以是浅拷贝.
// 浅拷贝
let obj = { a: 1, b: { c: 2 } };
let obj2 = { ...obj };
obj2.a = 3;
obj2.b.c = 4;
obj.b.e = {f:5}
console.log(obj);
console.log(obj2);
这段代码执行结果:
为什么拓展运算符是浅拷贝呢?
因为他只拷贝了表层a的值,复制了a的值放到了新创建的obj2这个新创建的空对象里面,但是深层的b,c,e,f的值他都没有拷贝,因为通过修改obj,可以看见,obj和obj2的a是不同的,这意味着obj和obj2的a是不同的地址,但是深层的obj和obj2的b,cef都是一样的,这意味着,obj2的b,c,e,f指向的是obj的b,c,e,f的地址,所以当修改obj的b,c,e,f的值,obj2的b,c,e,f也会修改.所以意味着拓展运算符是浅拷贝