这是一个非常实用的 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 }));
❌ 不支持
undefined
、function
、Symbol
、循环引用等。
✅ 合并多个对象
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 合并对象的主要方法有:
Object.assign()
:ES6 标准方法,支持多对象合并,注意使用{}
避免修改原对象;- 扩展运算符
...
:语法最简洁,推荐在现代项目中使用;- 深合并:需手动处理或使用 Lodash 的
_.merge()
;推荐使用
{ ...obj1, ...obj2 }
,它清晰、安全、符合现代 JavaScript 风格。⚠️ 所有方法默认都是浅合并,合并嵌套对象时需特别注意。
📌 一句话总结:能用扩展运算符就用扩展运算符。
THE END