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 } })
测试发现两种效果是一样的,深拷贝完成。