思路:
实现深拷贝的步骤很简单: (1)先判断传入的对象 是否为空,或者是否 是一个对象 (2)创建一个新对象(这里要注意,要把数组也考虑上),如果传入对象是一个数组,则 [ ] 赋给新对象,如果传入对象是一个普通对象,则 { } 赋给新对象 (3)遍历传入对象的属性(如果使用for..in遍历,则要考虑不能遍历到原型链上),如果属性是一个对象,则递归遍历,如果不是对象,则直接赋值给新对象
代码:
function deepCopy(obj) {
if (!obj || typeof obj !== "object") return
let newObj = obj instanceof Array ? [] : {}
// 这里使用for of和Object.entries 来遍历对象属性,所以不需要考虑会遍历到原型链
for (const [key, value] of Object.entries(obj)) {
newObj[key] = typeof value === "object" ? deepCopy(value) : value
}
return newObj
}
function deepCopy(obj) {
if (!obj || typeof obj !== "object") return
let newObj = obj instanceof Array ? [] : {}
// 这里使用for in来遍历对象属性,所以要考虑遍历到原型链的问题
for (const key in obj) {
// 判断是否是对象本身属性
if (obj.hasOwnProperty(key)) {
newObj[key] = typeof obj[key] === "object" ? deepCopy(obj[key]) : obj[key]
}
}
return newObj
}
下面是测试案例:
let obj = {
name: "mikasa",
user: {
name: "swj"
},
arr: [6, 6, 6]
}
console.log("obj:", obj);
let arr = [{ name: "aa" }, { age: 21 }, [1, 2, 3]]
console.log("arr:", arr);
// test
let newobj = deepCopy(obj)
newobj.user.name = "aron"
console.log("newobj:", newobj);
let newarr = deepCopy(arr)
newarr[2][2] = 666
console.log("newarr:", newarr);