为什么我的浅拷贝实现了深拷贝的效果?

发布于 2022-09-12 13:25:58 字数 423 浏览 26 评论 0

改变obj2的k2和k3属性,为什么obj1完全不受影响?

function shallowClone(obj){
    let newObj = {};
    for(const key in obj){
        newObj[key] = obj[key];
    }
    return newObj;
}

let obj1 = {
    k1:123,
    k2:{name:'k2'},
    k3:[1,2,[3,4]]
};
let obj2 = shallowClone(obj1);
obj2.k2 = {};
obj2.k3 = [1,2,3,4];
console.log(obj1);
console.log(obj2);

image

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

谎言 2022-09-19 13:25:58

两个概念:

  • 浅拷贝深拷贝都是针对引用类型,浅拷贝是只复制了这份引用,导致对拷贝后的值作出的修改,也会影响原对象
  • 对象的赋值操作(eg: obj2.k2 = {}),实际上改变了变量的引用

所以,你对深浅拷贝的检验方式本质上是有问题的:

let obj2 = shallowClone(obj1);
obj2.k2.name = 'gaarahan';
obj2.k3.push(5);

这个才是正确的检验方式

恍梦境° 2022-09-19 13:25:58

得先搞明白浅拷贝和深拷贝的概念吧————其实只用了解“引用”,这两者就都明白了。

在你的代码里,你可以尝试拷贝后修改obj2.k3[0],再打印比对。

丿*梦醉红颜 2022-09-19 13:25:58

并没有,你对什么是引用类型理解错误。

你这都给 obj2.k2obj2.k3 重新赋值了,根本也不是原来的对象引用了。

抛开浅拷贝的外壳,你这段代码跟下面的没有本质区别:

let obj1 = { value: 'foo' };
let obj2 = obj1;
obj2 = { value: 'bar' };
console.log(obj1); // 'foo'
console.log(obj2); // 'bar'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文