深拷貝:就是在復制資料或者物件的時候,將其記憶體中值復制過來,
淺拷貝:就是在復制資料或者物件的時候,是將其參考復制過來,
深拷貝和淺拷貝的區別:深拷貝復制的是被復制資料或者物件的值,復制的資料或物件會在記憶體中重新分配記憶體空間,賦值的和被賦值的互不影響;淺拷貝賦值的是被復制資料或者物件的參考,復制的資料或物件通過參考指向被復制資料或者物件參考所指向的值,
實作深拷貝:
不同的資料型別實作深拷貝的方式不同,按照資料型別實作深度拷貝可分為兩種:
第一種:基本資料型別實作深拷貝,直接使用賦值運算子就可以實作,
第二種:參考型別實作深拷貝:
參考型別實作深拷貝的核心思想就是需要將參考型別中個個基本資料項逐一拿出進行賦值,
可能不太理解,我們先舉例:
<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]中,

實作參考型別的深拷貝的核心思想是:需要將其物件每個基本資料型別逐一復制出來,
這個也是實作深拷貝的實作原理,你看了這篇文章,在去看看網上實作深拷貝的方法,是不是這么一回事?
我就只講原理,不講實作了,網上一大推,講了就多了一篇重復博客了
看都看到這了~~~~不點贊一下嗎??????
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/298974.html
標籤:其他
