首先,在進行認識深拷貝和淺拷貝之前,我們需要瞭解到W3關於數據類型的區分 數據類型: 基本類型:String/Number/Boolean/Null/undefined/Symbol/ 直接存儲在棧中的數據 引用類型:Object,Array等 存儲的時是對象在棧中的引用,真實的數據存放在堆記憶體里 ...
首先,在進行認識深拷貝和淺拷貝之前,我們需要瞭解到W3關於數據類型的區分
數據類型:
- 基本類型:String/Number/Boolean/Null/undefined/Symbol/
- 直接存儲在棧中的數據
- 引用類型:Object,Array等
- 存儲的時是對象在棧中的引用,真實的數據存放在堆記憶體里
接下來,我們開始瞭解深拷貝和淺拷貝:
------*深拷貝和淺拷貝是只針對Object和Array這樣的引用數據類型的
- 淺拷貝只複製指向某個對象的指針,而不複製對象本身,新舊對象還是共用同一塊記憶體。
- 實現方式
- Object.assign()--當Object只有一層時,該方法為深拷貝:因為如果屬性為基本類型,拷貝的就是基本類型的值,如果屬性是記憶體地址(引用類型),拷貝的就是記憶體地址,因此對象改變了地址的話就會影響另一個對象;
- Array.prototype.concat()
- Array.prototype.slice()
- 實現方式
- 淺拷貝另外創造一個一模一樣的對象,新對象和舊對象不共用記憶體,修改新對象不會影響舊對象
- 實現方式
- JSON.parse(JSON.stringfy(......))
- 當然,你也可以手動通過遞歸的方式去進行拷貝
1 //定義檢測數據類型的功能函數 2 function checkedType (target) { 3 return Object.prototype.toString.call(target).slice(8, -1) 4 } 5 //實現深度克隆---對象/數組 6 function clone (target) { 7 //判斷拷貝的數據類型 8 //初始化變數result 成為最終克隆的數據 9 let result, targetType = checkedType(target) 10 if (targetType === 'object') { 11 result = {} 12 } else if (targetType === 'Array') { 13 result = [] 14 } else { 15 return target 16 } 17 //遍歷目標數據 18 for (let i in target) { 19 //獲取遍曆數據結構的每一項值。 20 let value = target[i] 21 //判斷目標結構里的每一值是否存在對象/數組 22 if (checkedType(value) === 'Object' || checkedType(value) === 'Array') { 23 //對象/數組裡嵌套了對象/數組 24 //繼續遍歷獲取到value值 25 result[i] = clone(value) 26 } else { 27 //獲取到value值是基本的數據類型或者是函數。 28 result[i] = value; 29 } 30 } 31 return result 32 }
- 實現方式