面试题:JavaScript 中如何合并对象?

这是一个非常实用的 JavaScript 面试题,考察对对象操作和 ES6+ 语法的掌握。合并对象有多种方法,从传统到现代逐步演进。


✅ 方法一:Object.assign()(ES6,常用)

const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };

const merged = Object.assign({}, obj1, obj2);

console.log(merged); // { a: 1, b: 3, c: 4 }

🔍 说明:

  • 第一个参数是目标对象,后续是源对象
  • 使用 {} 作为目标对象,避免修改原对象
  • 浅拷贝:嵌套对象是引用复制

⚠️ 注意:

// 错误:会修改 obj1
Object.assign(obj1, obj2);

// 正确:不修改原对象
Object.assign({}, obj1, obj2);

✅ 方法二:扩展运算符 ...(ES2018,推荐)

const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };

const merged = { ...obj1, ...obj2 };

console.log(merged); // { a: 1, b: 3, c: 4 }

✅ 优点:

  • 语法简洁、直观
  • 不改变原对象
  • 支持动态属性、计算属性
  • 现代项目中推荐使用

🔧 高级用法:

const merged = {
  ...obj1,
  d: 5,
  ...obj2,
  [someKey]: someValue
};

✅ 方法三:Object.create() + Object.assign()(不常用)

适用于需要设置原型的场景:

const merged = Object.assign(Object.create(Object.getPrototypeOf(obj1)), obj1, obj2);

一般不需要这么复杂。


✅ 方法四:使用 for...in 手动合并(传统方式)

function mergeObjects(obj1, obj2) {
  const result = {};
  for (let key in obj1) {
    if (obj1.hasOwnProperty(key)) {
      result[key] = obj1[key];
    }
  }
  for (let key in obj2) {
    if (obj2.hasOwnProperty(key)) {
      result[key] = obj2[key];
    }
  }
  return result;
}

❌ 代码冗长,不推荐,仅用于理解原理。


✅ 方法五:深拷贝合并(处理嵌套对象)

以上方法都是浅拷贝,如果对象嵌套,修改会影响原对象。

const obj1 = { a: 1, nested: { x: 1 } };
const obj2 = { b: 2, nested: { y: 2 } };

// 浅合并:nested 被完全替换
const merged = { ...obj1, ...obj2 }; // nested: { y: 2 }

// 深合并(手动)
const deepMerged = {
  ...obj1,
  ...obj2,
  nested: { ...obj1.nested, ...obj2.nested }
}; // { a: 1, b: 2, nested: { x: 1, y: 2 } }

🔧 使用 Lodash:

const _ = require('lodash');
const merged = _.merge({}, obj1, obj2); // 深合并

🔧 使用 JSON.parse(JSON.stringify())(有局限)

const merged = JSON.parse(JSON.stringify({ ...obj1, ...obj2 }));

❌ 不支持 undefinedfunctionSymbol、循环引用等。


✅ 合并多个对象

const obj1 = { a: 1 };
const obj2 = { b: 2 };
const obj3 = { c: 3 };

const merged = { ...obj1, ...obj2, ...obj3 };
// 或
const merged = Object.assign({}, obj1, obj2, obj3);

✅ 总结(面试回答模板)

JavaScript 合并对象的主要方法有:

  1. Object.assign():ES6 标准方法,支持多对象合并,注意使用 {} 避免修改原对象;
  2. 扩展运算符 ...:语法最简洁,推荐在现代项目中使用;
  3. 深合并:需手动处理或使用 Lodash 的 _.merge()

推荐使用 { ...obj1, ...obj2 },它清晰、安全、符合现代 JavaScript 风格。

⚠️ 所有方法默认都是浅合并,合并嵌套对象时需特别注意。

📌 一句话总结:能用扩展运算符就用扩展运算符。

THE END
喜欢就支持一下吧
点赞13 分享