在JavaScript开发过程中,我们经常需要把两个对象的属性整合到一起,比如合并默认配置和用户自定义配置,或者拼接不同来源的数据对象。下面我们就来介绍几种常用的对象合并方法,以及它们的特点和使用注意事项。

使用Object.assign方法合并
Object.assign是ES6引入的原生方法,专门用来将一个或多个源对象的可枚举属性复制到目标对象,返回合并后的目标对象。它的基本语法是Object.assign(target, ...sources),第一个参数是目标对象,后面的参数是源对象。
合并两个对象的示例代码如下:
// 定义两个待合并的对象
const obj1 = { name: '张三', age: 20 };
const obj2 = { age: 25, hobby: '篮球' };
// 使用Object.assign合并,obj1作为目标对象,obj2作为源对象
const mergedObj = Object.assign(obj1, obj2);
console.log(mergedObj); // 输出:{ name: '张三', age: 25, hobby: '篮球' }
console.log(obj1); // 输出:{ name: '张三', age: 25, hobby: '篮球' },目标对象会被修改需要注意的是,Object.assign执行的是浅合并,如果对象的属性值是引用类型,只会复制引用地址,修改合并后对象的引用类型属性会影响原对象。另外如果多个源对象有同名属性,后面的源对象属性会覆盖前面的。
使用扩展运算符合并
扩展运算符...也是ES6新增的语法,同样可以实现对象合并,它的写法更简洁,而且不会修改原有的对象,是更推荐的使用方式。
示例代码如下:
// 定义两个待合并的对象
const obj1 = { name: '李四', score: 80 };
const obj2 = { score: 90, grade: 'A' };
// 使用扩展运算符合并,生成新对象
const mergedObj = { ...obj1, ...obj2 };
console.log(mergedObj); // 输出:{ name: '李四', score: 90, grade: 'A' }
console.log(obj1); // 输出:{ name: '李四', score: 80 },原对象未被修改
console.log(obj2); // 输出:{ score: 90, grade: 'A' },原对象未被修改扩展运算符的合并规则和Object.assign一致,后面的对象属性会覆盖前面的同名属性,同样属于浅合并。
自定义浅合并函数
如果不想依赖ES6的语法,也可以自己实现一个简单的浅合并函数,逻辑就是遍历源对象的所有属性,复制到目标对象上。
示例代码:
// 自定义浅合并函数
function shallowMerge(target, source) {
// 遍历源对象的所有可枚举属性
for (let key in source) {
// 只复制源对象自身的属性,不复制原型链上的属性
if (source.hasOwnProperty(key)) {
target[key] = source[key];
}
}
return target;
}
// 测试自定义合并函数
const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const merged = shallowMerge({}, obj1); // 先复制obj1到空对象,避免修改原对象
shallowMerge(merged, obj2);
console.log(merged); // 输出:{ a: 1, b: 3, c: 4 }实现深合并的方法
前面介绍的几种方法都是浅合并,如果遇到对象属性包含嵌套对象的情况,需要深合并才能保证数据独立。下面是一个简单的深合并实现示例:
// 自定义深合并函数
function deepMerge(target, source) {
// 遍历源对象的属性
for (let key in source) {
if (source.hasOwnProperty(key)) {
// 如果当前属性是对象,且目标对象对应属性也是对象,递归合并
if (typeof source[key] === 'object' && source[key] !== null && typeof target[key] === 'object' && target[key] !== null) {
deepMerge(target[key], source[key]);
} else {
// 否则直接赋值
target[key] = source[key];
}
}
}
return target;
}
// 测试深合并
const obj1 = { a: 1, info: { name: '王五', age: 20 } };
const obj2 = { info: { age: 22, hobby: '跑步' }, b: 2 };
const merged = deepMerge({}, obj1);
deepMerge(merged, obj2);
console.log(merged); // 输出:{ a: 1, info: { name: '王五', age: 22, hobby: '跑步' }, b: 2 }
console.log(obj1.info.age); // 输出:20,原对象未被修改需要注意的是,这个简单的深合并函数没有处理数组、日期、正则等特殊对象的情况,如果需要更完善的深合并,可以根据实际需求扩展逻辑,或者使用成熟的第三方库的相关方法。
不同合并方式的选择建议
如果只是合并简单对象,没有嵌套的引用类型属性,优先使用扩展运算符,写法简洁且不会修改原对象;如果需要兼容不支持ES6的环境,可以使用Object.assign或者自定义浅合并函数;如果对象包含嵌套结构,需要保证数据独立,就使用深合并的方法。另外合并时要注意同名属性的覆盖规则,避免重要数据被意外覆盖。
JavaScript对象合并Object_assign扩展运算符深拷贝修改时间:2026-05-29 03:21:31