js浅拷贝、深拷贝、递归

162 阅读1分钟

浅拷贝 拷贝的是外层 内层拷贝的是引用的地址

如果属性是基本类型,拷贝的就是基本类型的值。如果属性是引用类型,拷贝的就是内存地址

 var obj = {
        id: 1,
        name: 'lucy',
        msg: {
          age: 12,
          goods: {
            gname: 123,
            gtype: 1,
          },
        },
        colors: ['red', 'yellow', 'blue'],
      }

      var o = {}

      // 第一种
      // for (var k in obj) {
      //   // k 属性名  obj[k] 属性值
      //   o[k] = obj[k]
      // }

      // 第二种
      // Object.assign()方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
      // Object.assign(目标对象,源对象1,源对象2)

      // o = Object.assign({}, obj)

      // console.log(o)
      // o.name = '坤坤'
      // console.log(obj.name)
      // o.msg.age = 90
      // console.log(obj.msg)

      // -----浅拷贝数组
      // slice
      var arr = [11, 22, 33]
      // var newArr = arr.slice(0)

      // concat
      // var newArr = arr.concat()

      // 扩展运算符
      var newArr = [...arr]
      arr[1] = 'red'
      // console.log(newArr)

深拷贝 深拷贝开辟了一个新的栈,两个对象属完全相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性

      // 第一种方式  lodash提供的cloneDeep
      // 第二种方式 JSON.stringify
      o = JSON.parse(JSON.stringify(obj))
      // console.log(o)
      // o.name = '坤坤'
      // console.log(obj.name)
      // o.msg.age = 90
      // console.log(obj.msg)

      // 第三种方式  递归

递归 简单来说就是函数自己调用自己 必须有结束条件

      //  1+2+3+4+5+6+...+n
      function sum(n) {
        if (n == 1) {
          return 1
        }
        return n + sum(n - 1)
      }

      sum(5)

递归深拷贝

      var obj = {
        id: 1,
        name: 'lucy',
        msg: {
          age: 12,
          goods: {
            gname: 123,
            gtype: 1,
          },
        },
        colors: ['red', 'yellow', 'blue'],
      }

      var o = {}

      function deepCopy(newObj, oldObj) {
        for (var k in oldObj) {
          // 拿到对象中的每一个值赋值给变量item
          var item = oldObj[k]
          // 判断item的基本数据类型,还是对象,还是数组

          if (item instanceof Array) {
            //数组
            newObj[k] = []
            deepCopy(newObj[k], item)
          } else if (item instanceof Object) {
            //对象
            newObj[k] = {}
            deepCopy(newObj[k], item)
          } else {
            //基本数据
            newObj[k] = item
          }
        }
      }

      deepCopy(o, obj)
      o.msg.age = 56
      o.msg.goods.gname = 345
      console.log(obj)