所谓拷贝,就是赋值。把一个变量赋给另外一个变量,就是把变量的内容进行拷贝。把一个对象的值赋给另外一个对象,就是把一个对象拷贝一份。
在基本数值下不存在深拷贝和浅拷贝一说,即
var x = 10;
var y = x;
就是将x的值赋给了y,此时x和y都是10。如果要改变y值,x值不会改变。
引用类型进行拷贝时出现了问题
即是进行了地址拷贝,因为,引用类型赋值时,赋的值地址(就是引用类型变量在内存中保存的内容)
var arr1 = new Array(1,2,3)
Var arr2 = arr1;
这就是一个最简单的浅拷贝
如果要改变arr2所引用的数据:arr2[0]=100时,那么arr1[0]的值也是100。原因就是 arr1和arr2引用了同一块内存区域。
这是最简单的浅拷贝,因为,只是把arr1的地址拷贝的一份给了arr2,并没有把arr1的数据拷贝一份。所以,拷贝的深度不够。
如果是
obj1 = {
name:"man",
age:100,
interest:["1","2","3"]
}
如果将obj1拷贝给另一个对象,例如
var obj2 = obj1;
则会出现这种情况:
obj2.interest[0] = 100;
obj1.interest[0] = 100;
在内存上是这样的:
所以修改obj2里的interest里的值,obj1里的值也会被改动,因为他们interest的内存地址都是共同索引的同一个
所以有了深拷贝,就是可以在obj2里将interest索引地址与obj1中的索引地址区别开,成为如下图中这样:
则代码如下:
分别检测对象中的属性,当检测到interest时,对这个进行一层遍历赋值,其他基本类型就直接赋值给obj2就行。结果如下:
那么如果对象是这样呢?
属性的属性也是引用类型,即层层嵌套很多.怎么办,只能递归
简单的方法为
严谨一点为:
结果为:
从结果看出,修改obj2中的数据,obj1中的数据未收到影响,说明各自有各自的内存空间,完成了深拷贝要求。
如果内容有错误的地方欢迎指出;如果有帮助,欢迎点赞和收藏,转载请征得同意后著明出处,如果有问题也欢迎私信交流。