如何在JavaScript中合并两个对象?

来源:IPIPP.com作者:头衔:全栈工程师
导读:本期聚焦于小伙伴创作的《如何在JavaScript中合并两个对象?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在JavaScript中合并两个对象?》有用,将其分享出去将是对创作者最好的鼓励。

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

如何在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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。