为了账号安全,请及时绑定邮箱和手机立即绑定

请各位大佬指点!js中引用类型的复制,浅拷贝,深拷贝过程中堆栈如何变化?

请各位大佬指点!js中引用类型的复制,浅拷贝,深拷贝过程中堆栈如何变化?

HUX布斯 2019-10-08 10:41:47
题目描述js中引用类型的复制,浅拷贝,深拷贝过程中堆栈如何变化?题目来源及自己的思路在学习复制和浅拷贝的过程中,大部分博客都不清晰,把这两个混为一谈,所以请大佬们给我解析一下这三个的过程中,他们具体运行时堆栈里面有什么变化?下面摘抄别人的博客复制:当我们复制引用类型的变量时,实际上复制的是栈中存储的地址,所以复制出来的obj2实际上和obj指向的堆中同一个对象。因此,我们改变其中任何一个变量的值,另一个变量都会受到影响,这就是为什么会有深拷贝和浅拷贝的原因(复制我是理解的,但既然复制和浅拷贝都不一样了,为什么还要这样写?)。浅拷贝:创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是引用类型,拷贝的就是内存地址,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。(这个内存地址指的是堆中的地址吗?拷贝后在堆内存中又开辟一个新的存放还是别的?)还有种说法:浅拷贝是一层的拷贝,深拷贝是多层的拷贝…这种说法和上述的说法到底谁对谁错?我迷惑的是1:括号里面的问题?2:赋值和浅拷贝的区别到底在哪里?4.如果浅拷贝的一层都拷贝了,为什么两个引用类型还会相互影响?---------------v--------------根据下面两位回答的理解补充:5.赋值就等于浅拷贝?除了等号赋值之外还有其他浅拷贝方式吗?6.那“浅拷贝是一层数据的拷贝,深拷贝是多层的拷贝…”这个话是错的?7.那如果使用单层循环去给新对象赋值或者手动赋值的方法是就属于深拷贝,对吗?//循环letobj={a:1},obj2={}for(constkeyinobj){obj2[key]=obj[key]}obj2.a=2console.log(obj);//{a:1}console.log(obj2);//{a:2}//赋值letobj3={a:obj.a}obj3.a=3console.log(obj);//{a:1}console.log(obj3);//{a:3}8.浅拷贝的大致流程就是:在栈内存分配内存来存储新对象的地址,而这个地址与原对象一致,指向原对象在堆内存的地址,堆内存不做操作。那浅拷贝数据obj={a:1}时候原对象会随着新对象的值得改变而改变,对吗?最重要的问题!!!9:浅拷贝obj时多层属性时,其中堆栈变化是什么或者说怎么浅拷贝这个obj?letobj={a:1,b:{c:2},d:[1,2,3]}各位大佬不用讲那么基础的,emmm我是懂那些的,只是因为网上的信息说法不统一,有些混乱了不知道正确的是什么了,以上几个问题,可以直接回答对或不对,错在哪里就可以了,码字不易很感谢你们,谢谢。
查看完整描述

2 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

变量分为基本类型和引用类型
基本类型的赋值是值的赋值,不涉及引用的浅拷贝、深拷贝,就相当于给你一百块钱,你拿去随便花跟我没关系
引用类型的赋值是引用地址的赋值,相当于浅拷贝,就是给你个银行卡,密码给你,你花钱刷卡,我也可以刷卡,都会影响卡里面的钱
为了解决引用浅拷贝,就有了深拷贝,就是让引用类型像基本类型一样值的赋值,赋值后相互不影响,深拷贝一般都是递归遍历直到基本类型,去一个个赋值,这样就没有引用了,就是你注册一张卡,我把我卡里的钱打给你,你花你卡里的钱,我花我卡里的钱,不影响
                            
查看完整回答
反对 回复 2019-10-08
  • 2 回答
  • 0 关注
  • 299 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信