扩展运算符和Object.assign的拷贝属于浅拷贝,不是只拷贝地址吗?我为什么修改拷贝对象,按理说浅拷贝的也应该改变啊?浅拷贝不是拷贝的对象地址吗?
第一层深拷贝,第二层浅拷贝。你这只有一层,自然深拷贝,你再加一层,里层就是浅拷贝,外层深拷贝
https://blog.csdn.net/weixin_43878906/article/details/108358240
const bar = { a: 1, b: 2 };
//{ ...bar } 它的结果是一个新的 值 并不是一个内存地址 值是 { a: 1, b: 2 };
const baz = { ...bar };
//Object.assign({}, obj1); 它的结果是一个新的 值 并不是一个内存地址 值是 { a: 1, b: 2 };
//只有 baq=bar这样才是指向同一个地址 也就是 赋值操作才会 指向同一个内存地址
const baq = Object.assign({}, bar);
// 因为 他俩 不是一个 地址 所以结果 互不影响
bar.b = 9;
console.log(bar);
console.log(baz);
console.log(baq);
简单说 就是 Object.assign({}, obj1); 它的结果是一个新的对象 ,有自己的内存地址。 baq = Object.assign({}, bar); 这个 就是 把baq 指向了 Object.assign({}, bar);的地址 并不是bar的地址。 这样你能理解吗? 两个不同的地址当然不影响 。拓展运算符同理 。
上面那个 链接 里的例子里
let obj1 = { name: '张三', action: { say: 'hi'}; action.say 是第二层对象 。因为 拓展运算符和 assing只能 拷贝 第一层 。所以 对其拷贝 只能 拷贝内存地址 。 改变这个 原对象和 拷贝后的 都会影响
你这是展开又合并的,展开的时候,也是一些基本数据类型,所以会重新开辟内存空间,