深拷贝的几种方法

方法一:

function deepClone(obj) {
      const result = obj.constructor === Array ? [] : {} //判断obj是否是数组,然后创建数组或者对象
      if(obj && typeof obj === 'object'){
        for (let key in obj) {
          if (obj[key] && typeof obj[key] === 'object') {
            result[key] = deepClone(obj[key])
          } else {
            result[key] = obj[key]
          }
        }
        return result
      }
      return obj
    }
    const arr1 = [1,2,3,4,{}]
    const arr2 = deepClone(arr1)
    arr1.push(6)
    console.log('arr1:', arr1, 'arr2:', arr2)
    const obj1 = {a:2, b:3, c:4}
    const obj2 = deepClone(obj1)
    Object.assign(obj1, {d:5})
    console.log('obj1:', obj1, 'obj2:', obj2)

方法二:

JSON.parse(JSON.stringify(obj)) 

方法三

let deepClone = function (obj) {
      // Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)。
      // 创建一个以obj的原型链为原型的空对象
      let copy = Object.create(Object.getPrototypeOf(obj));
      // getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。
      // 创建数组,以obj的属性为对象的数组
      let propNames = Object.getOwnPropertyNames(obj);
      console.log(propNames)
      propNames.forEach(function (key) {
        // getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)
        // 找到obj上面 items对象的值
        let value = Object.getOwnPropertyDescriptor(obj, key);
        // copy对象代理属性
        Object.defineProperty(copy, key, value);
      });
      return copy;
};
posted @ 2020-05-14 15:52  acttan  阅读(430)  评论(0)    收藏  举报