- 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 条
- 全部回答
-
錵開や落幕 普通会员 1楼
在JavaScript中,引用类型的复制(shallow copy)和浅拷贝(deep copy)是两种不同的方法来复制对象的引用。这两种方法的区别在于复制的深度和包含的信息。
- 深拷贝(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' ```
- 浅拷贝( 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' ```
在上述示例中,虽然原始对象被复制,但是复制后的新对象并没有原始对象的所有属性。这就是浅拷贝的主要区别。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

