递归与深、浅拷贝|集创考核第十篇笔记

53 阅读2分钟

递归

  • 什么是递归?

    • 如果一个函数在内部可以调用其本身,那么这个函数就是递归函数

    • 简单理解:函数内部自己调用自己,这个函数就是递归函数

      var num = 1
      function fn() {
          console.log('我要打印6句话');
          if(num == 6) {
              return;
          }
          num++;
          fn();
      }
      fn();
      
    • 递归函数的作用和循环一样

    • 递归函数很容易发生”栈溢出“错误(stack overflow),所以必须要加退出条件return

  • 利用递归求数学题

    • 求1到n的阶乘

      function fn(n) {
          if(n == 1) {
                return 1;
          }
          return n * fn(n-1);
      }
      fn();
      
    • 求斐波那契序列

      function fn(n) {
          if(n == 1 || n == 2) {
              return 1;
          }
          return fn(n-1) + fn(n-2);
      }
      fn();
      
  • 利用递归求:根据id返回对应的数据对象

    • var data = [{
          id:1,
          name:'家电',
          goods:[{
              id:11,
              gname:'冰箱'
          },{
              id:12,
              gname:'洗衣机'
          }]
      },{
          id:2,
          name:'服饰'
      }];
      
      //我们想要输入id号,就可以返回的数据对象
      //利用forEach遍历里面的每一个对象
      function getID(json,id) {
          var o = {};
          json.forEach(function(item) {
              if(item.id === id) {
                  o = item;
                  //我们想要得到里层的数据,可以利用递归函数
                  //里面应该有goods这个数组,且数组长度不为0
              } else if(item.goods && item.goods.length > 0) {
                  o = getID(item.goods,id);
              } 
          })
          return o;
      }
      console.log(getID(data,1));
      
  • 浅拷贝和深拷贝

    • 浅拷贝只是拷贝一层,更深层次对象级别的指拷贝引用

      var obj = {
          id:1,
          name:'andy',
          msg:{
              age:18
          }
      };
      var o = {};
      for (var k in obj) {
          //k是属性名,obj[k]是属性值
          o[k] = obj[k];
      }
      //此为浅拷贝,其中深层次对象msg拷贝过去的是地址,在o修改msg中内容会影响obj中msg的内容
      
      Object.assign(o,obj)
      
    • Object.assign(target,…sources)

      • 第一个参数是要拷贝过去的对象
      • 第二个参数是原存在的对象
      • 此方法为浅拷贝
    • 深拷贝拷贝多层,每一级别的数据都会拷贝

      //深拷贝拷贝多层,每一级别的数据都会拷贝
      var obj = {
          id:1,
          name:'andy',
          msg:{
              age:18
          },
          color:['pink','red']
      };
      var o = {};
      //封装函数
      function deepCopy(newobj,oldobj) = {
          for(var k in oldobj) {
              //判断我们的属性值属于哪种数据类型
              //1.获取属性值
              var item = oldobj[k];
              //2.判断这个值是否是数组
              if(item instanceof Array) {
                  newobj[k] = [];
                  deepCopy(newobj[k],item);
              } else if(item instanceof Object) {   //3.判断这个值是否是对象
                  newobj[k] = {};
                  deepCopy(newobj[k],item);
                        } else {
                            newobj[k] = item;
                        }
              
              //4.属于简单数据类型
          }
      }
      deepCopy(o,obj);