什么是浅拷贝和深拷贝?为什么这样复制只能浅拷贝?(对数组对象无效)
function copyObj(obj) {
var newObj = {};
for (var p in obj) {
newObj[p] = obj[p];
}
return newObj;
}
正在回答
同学你好,老师举的例子跟视频老师的是不一样的。
1、在视频老师的例子里面:
是将函数返回出来的newObj赋值给了xh,此时xh与newObj指向的是同一个地址空间,所以是浅拷贝。
2、老师举的例子,并没有这个操作,没有将返回出来的对象赋值给某个变量,只是调用了函数,这个函数内部执行的操作是深拷贝,是将p对象里面的内容赋值给newObj。
所以在这个例子中函数内部执行的操作是深拷贝,函数外部执行的赋值操作是浅拷贝。
如果我的回答帮助到了你,欢迎采纳,祝学习愉快~
同学你好,关于同学的问题解答如下:
1、参考如下例子理解深拷贝与浅拷贝:
(1)浅拷贝就是值的复制。对象因为是引用类型,所以它的值就是一个指针。当改变其中一个的时候,另一个也会改变。如下obj把它的指针复制给obj1 ,所以这两个对象指向同一个内存地址。当改变obj1的a属性后,obj的属性a也会发生变化。这就是浅拷贝。
如下obj属性a的值也变成了2。
(2)深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。
再看如下例子:
obj1定义成了一个空对象,所以它与obj指向的不是一个内存地址了。然后获取obj的a属性值,把它赋值给obj1的属性a,此时再次改变obj1的a属性值,obj的属性a就不会跟随改变了。这就是深拷贝,对象进行复制的时候不把指针复制过去。
newObj[p] = obj[p];就和 obj1.a=obj.a;语法是一样的,就是把一个对象的属性赋值给另一个对象的属性,因为属性p是一个变量,所以要使用中括号的形式,如果属性不是一个变量,才使用点的形式。
综上, 简单理解就是浅拷贝是拷贝地址, 深拷贝是拷贝内容。
2、这样复制不是浅拷贝,是深拷贝:
两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。
如果我的回答帮助到了你,欢迎采纳,祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星