解题思路
- 首先判断传进来的 obj类型 是否是object,不是直接原样返回 obj
- 声明一个拷贝对象并且根据是否是数组赋值
- 遍历旧对象 obj
- 判断旧对象obj[key]是否是object, 如果是 则进行递归拷贝同时赋值给 拷贝对象 cyObj[key],反之直接赋值
- 最后递归完毕以后直接返回 拷贝对象 cyObj
- 最后的最后就是对应验证输出
let carProp = {
name: "summer",
carObj: {
color: "red",
size: "large",
},
cars: ["小卡车", "大卡车"],
};
function deepClone(obj) {
// 首先判断传进来的 obj类型 是否是object,不是直接原样返回 obj
if (typeof obj !== "object") return obj
// 声明一个拷贝对象并且根据是否是数组赋值
let cyObj = Array.isArray(obj) ? [] : {};
// 遍历旧对象 obj
for (let key in obj) {
// 判断旧对象obj[key]是否是object, 如果是 则进行递归拷贝同时赋值给 拷贝对象 cyObj[key],反之直接赋值
if (typeof obj[key] === "object") {
cyObj[key] = deepClone(obj[key]);
} else {
cyObj[key] = obj[key];
}
}
// 最后递归完毕以后直接返回 拷贝对象 cyObj
return cyObj;
}
let car1 = deepClone(carProp);
let car2 = deepClone(carProp);
let car3 = deepClone(function(ar) {return ar});
let car4 = deepClone(111);
car1.carObj['name'] = '打卡'
car1.name = '小薛'
car2.cars.shift()
console.log(car1); // {name: '小薛', carObj: {…}, cars: Array(2)}
console.log(car2); // {name: 'summer', carObj: {…}, cars: Array(1)}
console.log(car3); // ƒ (ar) {return ar}
console.log(car4); // 111