思路:

实现深拷贝的步骤很简单: (1)先判断传入的对象 是否为空,或者是否 是一个对象 (2)创建一个新对象(这里要注意,要把数组也考虑上),如果传入对象是一个数组,则 [ ] 赋给新对象,如果传入对象是一个普通对象,则 { } 赋给新对象 (3)遍历传入对象的属性(如果使用for..in遍历,则要考虑不能遍历到原型链上),如果属性是一个对象,则递归遍历,如果不是对象,则直接赋值给新对象

代码:

  1. function deepCopy(obj) {
  2. if (!obj || typeof obj !== "object") return
  3. let newObj = obj instanceof Array ? [] : {}
  4. // 这里使用for of和Object.entries 来遍历对象属性,所以不需要考虑会遍历到原型链
  5. for (const [key, value] of Object.entries(obj)) {
  6. newObj[key] = typeof value === "object" ? deepCopy(value) : value
  7. }
  8. return newObj
  9. }
  1. function deepCopy(obj) {
  2. if (!obj || typeof obj !== "object") return
  3. let newObj = obj instanceof Array ? [] : {}
  4. // 这里使用for in来遍历对象属性,所以要考虑遍历到原型链的问题
  5. for (const key in obj) {
  6. // 判断是否是对象本身属性
  7. if (obj.hasOwnProperty(key)) {
  8. newObj[key] = typeof obj[key] === "object" ? deepCopy(obj[key]) : obj[key]
  9. }
  10. }
  11. return newObj
  12. }

下面是测试案例:

  1. let obj = {
  2. name: "mikasa",
  3. user: {
  4. name: "swj"
  5. },
  6. arr: [6, 6, 6]
  7. }
  8. console.log("obj:", obj);
  9. let arr = [{ name: "aa" }, { age: 21 }, [1, 2, 3]]
  10. console.log("arr:", arr);
  11. // test
  12. let newobj = deepCopy(obj)
  13. newobj.user.name = "aron"
  14. console.log("newobj:", newobj);
  15. let newarr = deepCopy(arr)
  16. newarr[2][2] = 666
  17. console.log("newarr:", newarr);

image.png