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

2020-05-26  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读