递归深拷贝


递归深拷贝

基础版本 ,不兼容特殊对象、无法处理循环引用
  let arrObj = [
    {
      path: '/login',
      name: '登录',
      exact: true,
      render(props) {
        // return (<div>什么呢</div>)
      }
    }
  ]
  // 递归深拷贝
  /**
   * typeof 判断 null array 对象 都是 object, 但可以准确判断出函数为 function
  */
  const deepClone = (source) => {
    if (!source && typeof source !== 'object') {
      throw new Error('err')
    }
    const container = source.constructor === Array ? [] : {}
    Object.keys(source).forEach(item => {
      if (source[item] && typeof source[item] === 'object') {
        console.log('this', this);  // window
        container[item] = deepClone(source[item]) // this.deepClone
      } else {
        container[item] = source[item]  // 函数这里是否是浅拷贝了?
      }
    })
    return container
  }

  let copyObj = deepClone(arrObj)

  let lightCopy = arrObj

  console.log(copyObj === arrObj); // false
  console.log(lightCopy === arrObj); // true
升级版,兼容特殊对象、循环引用
export const deepClone = (source: any) => {
    let map = new WeakMap();// 对拷贝的对象做个记录
    
    // typeof 判断数据类型 ,null , 对象,数组都是object
    function deepContent(source: any) {
        if (source === null) {// typeof判断 null 也为object , 这里需要再做一次判断
            return null;
        }
        if (typeof source !== 'object') { // 去除可能为undefined 的值
            return source;
        }
        if (source.constructor === Date) { // 兼容特殊对象
            return new Date(source);
        }
        if (source.constructor === RegExp) {
            return new RegExp(source);
        }

        if (map.get(source)) {// 如果存在 (之前做过记录),不再拷贝,直接返回
            return map.get(source);
        }
        const currentItem = source.constructor === Array ? [] : {};
        map.set(source, currentItem);// 其他情况才拷贝
        for (let key in source) {
            if (source.hasOwnProperty(key)) {
                if (source[key] && typeof source[key] === 'object') {
                    currentItem[key] = deepContent(source[key]);
                }
                else {
                    currentItem[key] = source[key];
                }
            }
        }
        return currentItem;
    }
    return deepContent(source); // 返回值为一个函数的执行结果,结果是一个对象
};

九九乘法表(递归)


const chengfa = (num: number) => {
    console.log('1111')
  if (num == 1) {
    console.log('1X1=1');
  } else {
    chengfa(num - 1)  // 这里递归会连续调9次
    console.log('牛皮',num);
    for (var i = 1, str = ''; i <= num; i++) { // 每次递归的for循环都会等待前面的递归函数执行完毕,才执行下面的for循环
      console.log('323232323232');              // 为什么会等待,函数要执行完毕!
      str += i + 'x' + num + '=' + i * num + ' '  // 9 会等待8的递归,8 会等待7 ...
    }
    console.log(str)
  }
}

console.log(chengfa(9));

// 1X1=1
// 1x2=2 2x2=4 
// 1x3=3 2x3=6 3x3=9
// 1x4=4 2x4=8 3x4=12 4x4=16
// 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
// 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
// 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
// 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
// 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

// 1111111
// 1111111
// 1111111
// 1111111
// 1111111
// 1111111
// 1111111
// 1111111
// 1111111
// 1X1=1
// 牛皮 2
// 323232323232
// 323232323232
// 1x2=2 2x2=4 
// 牛皮 3
// 323232323232
// 323232323232
// 323232323232
// 1x3=3 2x3=6 3x3=9 
// 牛皮 4
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 1x4=4 2x4=8 3x4=12 4x4=16         
// 牛皮 5
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 
// 牛皮 6
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
// 牛皮 7
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
// 牛皮 8
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
// 牛皮 9
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
// undefined

文章作者: KarlFranz
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 reprint policy. If reproduced, please indicate source KarlFranz !
评论
  目录