深拷贝:就是在复制数据或者对象的时候,将其内存中值复制过来。
浅拷贝:就是在复制数据或者对象的时候,是将其引用复制过来。
深拷贝和浅拷贝的区别:深拷贝复制的是被复制数据或者对象的值,复制的数据或对象会在内存中重新分配内存空间,赋值的和被赋值的互不影响;浅拷贝赋值的是被复制数据或者对象的引用,复制的数据或对象通过引用指向被复制数据或者对象引用所指向的值。
实现深拷贝:
不同的数据类型实现深拷贝的方式不同,按照数据类型实现深度拷贝可分为两种:
第一种:基本数据类型实现深拷贝,直接使用赋值运算符就可以实现。
第二种:引用类型实现深拷贝:
引用类型实现深拷贝的核心思想就是需要将引用类型中个个基本数据项逐一拿出进行赋值。
可能不太理解,我们先举例:
<script>
let arr = [1, 2, 3]
let arr2 = arr
arr2[0] = 100
console.log(arr2);
console.log(arr);
</script>
打印以上代码:
打印结果是arr2数组元素的赋值影响到了arr,我们在通过遍历,建arr的数据逐一拿出,放到arr2。
<script>
let arr = [1, 2, 3]
let arr2=[]
for(let i=0,len=arr.length;i<len;i++){
arr2[i]=arr[i]
}
arr2[0]=100
console.log(arr);
console.log(arr2);
</script>
打印结果为:
此时arr2不会影响到arr。为什么呢,因为我们使用的是基本数据类型赋值,就是直接把arr中的一个个基本项赋值给了arr2,而这些基本数据项目是一个个基本数据类型,而不是引用。
再来一段代码:
<script>
let arr = [[1,2], 2, 3]
let arr2=[]
for(let i=0,len=arr.length;i<len;i++){
arr2[i]=arr[i]
}
arr2[0][0]=100
console.log(arr);
console.log(arr2);
</script>
打印结果:
如果不是逐一实现引用类型的基本项进行赋值,两个数组都会相互影响。
又来一段代码:
<script>
let arr = [[1,2], 2, 3]
let arr2=[]
for(let i=0,len=arr.length;i<len;i++){
arr2[i]=arr[i]
}
arr2[0]=100
console.log(arr);
console.log(arr2);
</script>
结果为:
同一方式拷贝,两个数组好像互不影响了,但是,这里是个坑,arr2[0]=100,这里是指将arr数组的[1,2]这个元素的引用替换成100。arr[0]这个元素是一个应用类型,在栈中有个引用,引用和基本数据类型都在栈内存。arr2[0]=100的100是基本数据类型,存贮在栈内存中,顾名思义就是arr2[0]原本的在栈内存中的引用变成了100,才未使得其arr[0]中的对象未能指向其所在的堆内存的[1,2]中。
实现引用类型的深拷贝的核心思想是:需要将其对象每个基本数据类型逐一复制出来。
这个也是实现深拷贝的实现原理。你看了这篇文章,在去看看网上实现深拷贝的方法,是不是这么一回事?
我就只讲原理,不讲实现了,网上一大推。讲了就多了一篇重复博客了
看都看到这了~~~~不点赞一下吗??????