思路:
实现深拷贝的步骤很简单: (1)先判断传入的对象 是否为空,或者是否 是一个对象 (2)创建一个新对象(这里要注意,要把数组也考虑上),如果传入对象是一个数组,则 [ ] 赋给新对象,如果传入对象是一个普通对象,则 { } 赋给新对象 (3)遍历传入对象的属性(如果使用for..in遍历,则要考虑不能遍历到原型链上),如果属性是一个对象,则递归遍历,如果不是对象,则直接赋值给新对象
代码:
function deepCopy(obj) {if (!obj || typeof obj !== "object") returnlet 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") returnlet 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);// testlet newobj = deepCopy(obj)newobj.user.name = "aron"console.log("newobj:", newobj);let newarr = deepCopy(arr)newarr[2][2] = 666console.log("newarr:", newarr);

