• 深拷贝与浅拷贝


    深拷贝

    $.extend(),设置为true是深拷贝

    var x = {
        a: 1,
        b: { f: { g: 1 } },
        c: [ 1, 2, 3 ]
    };
    
    var y = $.extend({}, x),          //shallow copy
        z = $.extend(true, {}, x);    //deep copy
    
    y.b.f === x.b.f       // true
    z.b.f === x.b.f       // false

    原生实现:
    深复制则不同,它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制(注意递归,引用类型有多层结构)到新对象上

    function deepCopy(p,c){
        var i;
        c = c||{};
        for(i in p){
            if(p.hasOwnProperty(i)){
                if(typeof(p[i])==="object"){
                    c[i] = Array.isArray(p[i])?[]:{};
                    deepCopy(p[i],c[i]);
                }else{
                    c[i] = p[i];
               }
            }
        }
        return c;
    }

    专门针对json对象的深拷贝:针对纯 JSON 数据对象的深复制,使用 JSON 全局对象的 parse 和 stringify 方法来实现深复制也算是一个简单讨巧的方法。然而使用这种方法会有一些隐藏的坑,它能正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,即那些能够被 json 直接表示的数据结构。

    function jsonClone(obj) {
        return JSON.parse(JSON.stringify(obj));
    }
    var clone = jsonClone({ a:1 });

    浅拷贝的方法

    var obj = { a:1, arr: [2,3] };
    var shallowObj = shallowCopy(obj);
    
    function shallowCopy(src) {
      var dst = {};
      for (var prop in src) {
        if (src.hasOwnProperty(prop)) {
          dst[prop] = src[prop];
        }
      }
      return dst;
    }

    Object.assign(...)

    var y = $.extend({}, x), //shallow copy


    参考
    https://github.com/LiuL0703/blog/issues/19
    http://jerryzou.com/posts/dive-into-deep-clone-in-javascript/
  • 相关阅读:
    1、Elasticsearch教程-从入门到精通
    3、ik分词器
    2、ElasticSearch的安装
    svn操作
    2020-10
    编写第一个linux驱动
    字符设备驱动
    Linux下/dev和/sys/class的区别
    latex
    Qt
  • 原文地址:https://www.cnblogs.com/afterwawa/p/8955501.html
Copyright © 2020-2023  润新知