美文网首页
深拷贝、浅拷贝的区别及方法

深拷贝、浅拷贝的区别及方法

作者: 柚子硕 | 来源:发表于2020-05-26 10:51 被阅读0次

    深拷贝浅拷贝的区别在于深拷贝是在内存中重新创建一块区域,和拷贝对象再无联系。浅拷贝中两个对象的参数仍会指向同一块区域,所以修改任一对象内的值,另一个对象的值也会改变。

    深拷贝的方法

    1.递归拷贝

     // 深拷贝
        function deepCopy(o1, o2) {
          for (var key in o1) {
            if (o1[key] instanceof Array) {
              console.log(key);
              // 如果key是数组类型 Array?   
              o2[key] = [];
              deepCopy(o1[key], o2[key]);
            } else if (o1[key] instanceof Object) {
              // 如果key是复杂类型 Object?  
              o2[key] = {};
              deepCopy(o1[key], o2[key]);
            } else {
              // 如果key这个属性 是基本类型
              o2[key] = o1[key];
            }
          }
        }
    

    2.JSON.stringify()

    如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式。而不是时间对象;
    如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象;
    如果obj里有函数,undefined,则序列化的结果会把函数或 undefined丢失;
    如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null
    JSON.stringify()只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor;

    3.Object.defineProperty

    Object.defineProperty(Object, "deepClone", {
      configurable: true,
      enumerable: true,
      writable: false,
      value: function(dest, source) {
        if (dest === undefined || source === undefined) {
          throw Error("dest can not be undefined");
        }
        if (!(source instanceof Object)) {
          throw Error(source, "is not a object");
        }
        Object.getOwnPropertyNames(source).forEach(function(prop) {
          if (typeof source[prop] === Object) {
            Object.deepClone(dest[prop], source[prop]);
          } else {
            dest[prop] = source[prop];
          }
        });
      }
    });
    
    浅拷贝的方法

    1.Object.assign()


    image.png

    2.解构赋值


    image.png

    相关文章

      网友评论

          本文标题:深拷贝、浅拷贝的区别及方法

          本文链接:https://www.haomeiwen.com/subject/mqbeuhtx.html