• 递归 深拷贝


    // 递归深拷贝!
        function clone(Obj) {
            var newObj;   
            if (Obj instanceof Array) {
                newObj = [];  // 创建一个空的数组
                var i = Obj.length;
                while (i--) {
                    newObj[i] = clone(Obj[i]);
                }
                return newObj;
            } else if (Obj instanceof Object){
                newObj = {};  // 创建一个空对象
                for (var k in Obj) {  // 为这个对象添加新的属性
                    newObj[k] = clone(Obj[k]);
                }
                return newObj;
            }else{
                return Obj;
            }
        }

    当你想复制一个对象或者一个数组时,如何做到互不影响,而且可以做到深拷贝呢,我们先来说说深拷贝和浅拷贝吧

    首先深拷贝和浅拷贝只针对像 Object, Array 这样的复杂对象的。简单来说,浅拷贝只复制一层对象的属性,而深复制则递归复制了所有层级。

    var obj = { a:1, arr: [9,10] };
    var reObj = Copy(obj);
    
    function Copy(src) {
      var dst = {};
      for (var prop in src) {
        if (src.hasOwnProperty(prop)) {
          dst[prop] = src[prop];
        }
      }
      return dst;
    }

    上面是一个简单的浅复制实现,因为浅复制只会将对象的各个属性进行依次复制,并不会进行递归复制,而 JavaScript 存储对象都是存地址的,所以浅复制会导致 obj.arr 和 reObj.arr 指向同一块内存地址。

    再来看看刚开篇时的代码,首先确定类型,然后确定递归的回调,最终到达对象或者数组的末端,达到深拷贝的要求。

  • 相关阅读:
    hive_case
    hive_group
    linux-搭建ngnix
    Nfs服务器搭建
    几种常见的启动脚本
    linux 修改本机的端口映射
    oracle-sql计算
    linux 磁盘大小查看
    postMan测试接口的几种方式
    oracle迁移到12c的时列转行 wm_concat 报错解决
  • 原文地址:https://www.cnblogs.com/hzhj/p/6476728.html
Copyright © 2020-2023  润新知