什么是浅拷贝和深拷贝?为什么这样复制只能浅拷贝?(对数组对象无效)

什么是浅拷贝和深拷贝?为什么这样复制只能浅拷贝?(对数组对象无效)

function copyObj(obj) {

var newObj = {};

for (var p in obj) {

newObj[p] = obj[p];

}

return newObj;

}


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,老师举的例子跟视频老师的是不一样的。

1、在视频老师的例子里面:

http://img1.sycdn.imooc.com/climg/5e00683c09db935507050610.jpg

是将函数返回出来的newObj赋值给了xh,此时xh与newObj指向的是同一个地址空间,所以是浅拷贝。

2、老师举的例子,并没有这个操作,没有将返回出来的对象赋值给某个变量,只是调用了函数,这个函数内部执行的操作是深拷贝,是将p对象里面的内容赋值给newObj。

所以在这个例子中函数内部执行的操作是深拷贝,函数外部执行的赋值操作是浅拷贝。

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

好帮手慕粉 2019-12-23 11:56:56

同学你好,关于同学的问题解答如下:

1、参考如下例子理解深拷贝与浅拷贝:

(1)浅拷贝就是值的复制。对象因为是引用类型,所以它的值就是一个指针。当改变其中一个的时候,另一个也会改变。如下obj把它的指针复制给obj1 ,所以这两个对象指向同一个内存地址。当改变obj1的a属性后,obj的属性a也会发生变化。这就是浅拷贝。

http://img1.sycdn.imooc.com//climg/5e0039ce0968494f02240086.jpg

如下obj属性a的值也变成了2。

http://img1.sycdn.imooc.com//climg/5e0039de0965060e01520050.jpg


(2)深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。

再看如下例子:

obj1定义成了一个空对象,所以它与obj指向的不是一个内存地址了。然后获取obj的a属性值,把它赋值给obj1的属性a,此时再次改变obj1的a属性值,obj的属性a就不会跟随改变了。这就是深拷贝,对象进行复制的时候不把指针复制过去。

http://img1.sycdn.imooc.com//climg/5e0039fc095ed70303320153.jpg

http://img1.sycdn.imooc.com//climg/5e003a060968802401270060.jpg

newObj[p] = obj[p];就和 obj1.a=obj.a;语法是一样的,就是把一个对象的属性赋值给另一个对象的属性,因为属性p是一个变量,所以要使用中括号的形式,如果属性不是一个变量,才使用点的形式。

综上, 简单理解就是浅拷贝是拷贝地址,  深拷贝是拷贝内容。

2、这样复制不是浅拷贝,是深拷贝:

http://img1.sycdn.imooc.com//climg/5e003aec09db8c2609070475.jpg

两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

  • 提问者 迷失的小麦 #1
    为什么老师在视频11分27秒的时候说是浅拷贝?
    2019-12-23 14:06:37
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师