使用 ES9 的 Object .assign 方法实现对象深度合并

在前端开发中,我们经常需要将两个或多个对象合并成一个对象,这种操作在 Vue、React 等框架中使用的非常频繁。在 ES6 中,我们可以使用 Object.assign() 方法实现对象的合并操作。但是,Object.assign() 只能进行浅拷贝,对于对象中嵌套的对象或数组,合并的结果会出现问题。为了解决这个问题,ES9 引入了 Object.assign() 的深度拷贝版本,可以解决这个问题。

什么是深度拷贝

浅拷贝只是复制了对象本身的属性,如果对象中有嵌套的对象或数组,浅拷贝只是将这些对象或数组的引用复制到新对象中,而不是真正的拷贝这些对象或数组。这就导致了一旦原对象中这些子对象或数组内容发生改变,新对象中的相应内容也会发生改变,这显然不是我们想要的效果。深度拷贝是将对象中的所有属性以及嵌套的对象或数组全部复制到新对象中,每个嵌套的对象或数组都是新对象中独立的,对原对象的改变不会影响新对象。

Object.assign 的深度拷贝版本

在 ES9 中,Object.assign 发生了一些变化,引入了一个新的方法 Object.assignDeep(),它可以进行深度拷贝。具体实现方式如下:

Object.defineProperty(Object, 'assignDeep', {
  enumerable: false,
  configurable: true,
  writable: true,
  value: function(target, ...sources) {
    if (target == null) {
      throw new TypeError('Cannot convert undefined or null to object');
    }
    sources.forEach(source => {
      if (source != null) {
        Object.keys(source).forEach(key => {
          if (typeof source[key] === 'object' && typeof target[key] === 'object') {
            Object.assignDeep(target[key], source[key]);
          } else {
            target[key] = source[key];
          }
        });
      }
    });
    return target;
  }
});

使用 Object.assignDeep() 方法可以进行深度合并操作。

示例代码

const obj1 = {
  a: 1,
  b: {
    c: 2,
    d: [3, 4]
  }
};

const obj2 = {
  b: {
    d: [5, 6],
    e: 7
  },
  f: 8
};

const result = Object.assignDeep(obj1, obj2);

console.log(result);
/*
{
  a: 1,
  b: {
    c: 2,
    d: [5, 6],
    e: 7
  },
  f: 8
}
*/

在上面的示例代码中,我们将 obj1 和 obj2 两个对象进行了深度合并,结果存在 result 变量中,可以看到合并后的对象包含了 obj1 和 obj2 中所有的属性,而且嵌套的对象和数组也都是独立的。

总结

ES9 引入了 Object.assign() 的深度拷贝版本 Object.assignDeep(),可以解决对象深度合并的问题。使用 Object.assignDeep() 方法可以非常方便地进行对象的深度合并操作。这个方法的实现原理也比较简单,利用递归方法实现了对象深度遍历,将嵌套的对象和数组进行了深拷贝。掌握这个方法可以在前端开发中实现更加复杂和高效的对象合并操作,具有较好的学习和指导意义。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b33bb1add4f0e0ffc4c3a2