账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    js中引用类型的复制,浅拷贝,深拷贝过程中堆栈如何变化?
    • 搞笑的五妹2019-09-19 00:00
    • 11
    36
    0

    题目描述

    js中引用类型的复制,浅拷贝,深拷贝过程中堆栈如何变化?

    题目来源及自己的思路

    在学习复制和浅拷贝的过程中,大部分博客都不清晰,把这两个混为一谈,所以请大佬们给我解析一下这三个的过程中,他们具体运行时堆栈里面有什么变化?

    下面摘抄别人的博客

    复制:当我们复制引用类型的变量时,实际上复制的是栈中存储的地址,所以复制出来的obj2实际上和obj指向的堆中同一个对象。因此,我们改变其中任何一个变量的值,另一个变量都会受到影响,这就是为什么会有深拷贝和浅拷贝的原因(复制我是理解的,但既然复制和浅拷贝都不一样了,为什么还要这样写?)。

    浅拷贝:创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是引用类型,拷贝的就是内存地址
    ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。(这个内存地址指的是堆中的地址吗?拷贝后在堆内存中又开辟一个新的存放还是别的?)

    还有种说法:浅拷贝是一层的拷贝,深拷贝是多层的拷贝…这种说法和上述的说法到底谁对谁错?

    我迷惑的是

    1:括号里面的问题?
    2:赋值和浅拷贝的区别到底在哪里?
    4.如果浅拷贝的一层都拷贝了,为什么两个引用类型还会相互影响?
    ---------------v--------------

    根据下面两位回答的理解补充:

    5.赋值就等于浅拷贝?除了等号赋值之外还有其他浅拷贝方式吗?
    6.那“浅拷贝是一层数据的拷贝,深拷贝是多层的拷贝…”这个话是错的?
    7.那如果使用单层循环去给新对象赋值或者手动赋值的方法是就属于深拷贝,对吗?

    //循环
     let obj={a:1}, obj2 = {}
     for (const key in obj) {
         obj2[key] = obj[key]
     }
     obj2.a =2
     console.log(obj);//{a: 1}
     console.log(obj2);//{a: 2}
    //赋值
     let obj3 ={
         a:obj.a
     }
     obj3.a = 3
     console.log(obj);//{a: 1}
     console.log(obj3);//{a: 3}

    8.浅拷贝的大致流程就是:在栈内存分配内存来存储新对象的地址,而这个地址与原对象一致,指向原对象在堆内存的地址,堆内存不做操作。那浅拷贝数据obj = {a:1}时候原对象会随着新对象的值得改变而改变,对吗?

    最重要的问题!!! 9:浅拷贝obj时多层属性时,其中堆栈变化是什么或者说怎么浅拷贝这个obj?

    let obj = {a:1,b:{c:2},d:[1,2,3]}
    各位大佬不用讲那么基础的,emmm我是懂那些的,只是因为网上的信息说法不统一,有些混乱了不知道正确的是什么了,以上几个问题,可以直接回答对或不对,错在哪里就可以了,码字不易很感谢你们,谢谢
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 錵開や落幕 普通会员 1楼

      在JavaScript中,引用类型的复制(shallow copy)和浅拷贝(deep copy)是两种不同的方法来复制对象的引用。这两种方法的区别在于复制的深度和包含的信息。

      1. 深拷贝(Deep Copy):深拷贝是通过递归地复制对象的属性和方法来实现的。复制过程中,JavaScript引擎会跟踪引用的位置,然后将其复制到新的对象中。这意味着新对象会包含原始对象的所有属性和方法,而且它们在内存中的索引是相同的。

      例如:

      ```javascript let original = { name: 'John', age: 30, city: 'New York' };

      let copied = original; console.log(copied.name); // 输出 'John' console.log(copied.age); // 输出 30 console.log(copied.city); // 输出 'New York' ```

      1. 浅拷贝( shallow copy):浅拷贝是通过创建一个新的对象来实现的。在复制过程中,JavaScript引擎会保留对象的引用,然后将其复制到新对象中。这意味着新对象只包含原始对象的所有属性,而且它们在内存中的索引是不同的。

      例如:

      ```javascript let original = { name: 'John', age: 30, city: 'New York' };

      let copied = Object.assign({}, original); console.log(copied.name); // 输出 'John' console.log(copied.age); // 输出 30 console.log(copied.city); // 输出 'New York' ```

      在上述示例中,虽然原始对象被复制,但是复制后的新对象并没有原始对象的所有属性。这就是浅拷贝的主要区别。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部