1. 首先使用JSON.parse來實現一個深拷貝
let test = { x : 1, y : 2, z : { a : 4, b : 5 } } // 深拷貝 let result = JSON.parse(JSON.stringify(test)); // 改變拷貝后的值 result.z.a = 40; console.log(test); console.log(result);
function deepClone(obj){ let cloneObj; // 判斷當輸入的數據是簡單數據類型時,直接復制 if(obj && typeof obj !== 'object'){ cloneObj = obj; } // 當輸入的數據是對象或者數組時 else if(obj && typeof obj === 'object'){ // 檢測輸入的數據是數組還是對象 cloneObj = Array.isArray(obj) ? [] : {}; // 變量數據對象 for(let key in obj){ // 判斷對象是否存在key屬性 if(obj.hasOwnProperty(key)){ if(obj[key] && typeof obj[key] === 'object'){ // 若當前元素類型為對象時,遞歸調用 cloneObj[key] = deepClone(obj[key]); } // 若當前元素類型為基本數據類型 else{ cloneObj[key] = obj[key]; } } } } return cloneObj; } // 測試用例 deepClone({ x: 1, y: [ 5, 6, 7 ], z: { a: 0, b: 1 } })
測試發現兩種效果是一樣的,深拷貝完成。