Kasan Blog

递归实现深拷贝

深拷贝和浅拷贝的区别?

一个是地址引用,一个是新开辟一块内存,深拷贝的对象和原对象是两个独立的内容,互不干扰。

思路:前面的类型过滤不说了,主要先判断是数组还是对象,从而创建 不同的中间容器(newObj),那么这里假设传入的是一个对象,传入到deepCopy时,

就会遍历传入对象的内容(item),如果是简单类型,就直接赋值给newObj,

如果item 是个对象,为了获取到item 里的属性,就需要继续调用自己(deepCopy)把对象传入,这样循环地获取对象里的内容,然后返回到newObj上,最后返回newObj,就实现了深拷贝

// 递归调用
const deepCopy = (obj) => {
    // 判断传入的值是否为一个对象
    if (obj === null && typeof obj !== "object") {
        console.log('不是一个对象')
      return obj;
    }
    // 判断对象的类型 注意这里不考虑包装类对象
    if (Object.prototype.toString.call(obj) === "[object Date]") {
      return new Date(obj);
    }
    if (Object.prototype.toString.call(obj) === "[object RegExp]") {
      return new RegExp(obj);
    }
    if (Object.prototype.toString.call(obj) === "[object Undefined]") {
      return new Error(obj);
    }
    // 判断对象是类
    let newObj = Array.isArray(obj)  ? [] : {}
    for(let item in obj){
      if(typeof obj[item] === 'object') {  //如果item是一个对象,就继续引用自己去遍历此对象里的属性,如果此对象里还有对象,就会继续循环获取直至没有对象
        console.log('是object')
          newObj[item] = deepCopy(obj[item])
      }else { // 如果此item 不是一个对象,就直接赋值给newObj 
        console.log('不是object')
          newObj[item] = obj[item]
      }
    }
    return newObj
  };
  
  const foo = {
      name: '渣渣辉',
      info: {
          age: 24
      },
      fn:()=>{
        console.log('123')
      },
      test : 10086
  }
  const newFoo = deepCopy(foo)
  foo.info.age = 25
  console.log(foo === newFoo) // false ,地址不一样证明实现深拷贝