浅克隆与深克隆
2019-03-23 本文已影响0人
搬不完的元猿员
什么是深克隆,什么是浅克隆?
克隆针对的是对象,数组,函数等复杂数据。
浅克隆根本上改变的是同一个对象,只是将栈内存中的引用复制一下,然后赋给一个变量,其实两个指向同一地址。而且一个改变另一个也会改变。
深克隆是创建一个全新的对象,将原对象数据复制过去,但两者之间没有联系
浅克隆
例如:

浅克隆
我们定义了一个数组a,里面有三个元素,把a赋给变量b,那么输出b的内容发现和a相同。这里创建出的数组(array)被放在堆内存中,而a,b两个引用都是在栈内存中。array包含了三个元素,a和b则仅仅是一个地址,指向了array,和C语言中的指针非常相似。这里就是一个简单的浅克隆的例子,把数组array的引用复制一份给b,让两个变量都指向array。这时候任意一个引用对array做出的修改都会影响到另一个引用上。
递归完成深克隆
例如:

深克隆第一部分
首先判断元素是否是object,然后创建一个对象赋给result。然后遍历arr中所有的元素,递归判断是否是深层对象,不是返回赋给result。这样就实现了深克隆。下面测试一下:

深克隆第二部分
输出结果:

可以看到在对原数组操作时,克隆返回的数组内容不会改变。两个数组是完全不同的两个对象,在堆内存中各占一块,没有关联。
总结
所谓深克隆就是创造一个完全一样的对象,将原对象的所有元素拷贝过来即可。
浅克隆就是复制一份引用,所有引用指向同一份数据。
更多前端内容请 点击关注