JavaScript 对象合并方法详解及最佳实践(2026年最新版)

JavaScript 对象合并方法详解及最佳实践(2026年最新版)

在 JavaScript 中,对象合并(Object Merge)是常见操作,用于将多个对象的属性组合成一个新对象。这在处理配置、状态管理、API 数据整合等场景中非常实用。ES6+ 引入了更简洁的方法,但需注意浅合并 vs 深合并的区别。下面从方法详解、代码示例、最佳实践三个维度系统拆解。

一、常见对象合并方法详解

JavaScript 提供了内置方法和第三方库支持。以下是2026年主流方法对比表(基于浅/深合并、性能、兼容性等维度):

方法名称描述合并类型优点缺点适用场景引入方式(ES6+)
Object.assign()将一个或多个源对象的可枚举属性复制到目标对象,返回目标对象。浅合并内置、无需库;支持多个源对象;简单高效。修改目标对象(需用空对象避免);不处理嵌套对象(覆盖整个子对象)。简单配置合并、默认值填充。原生
Spread Operator (…)使用扩展运算符在对象字面量中展开源对象属性,创建新对象。浅合并语法简洁、现代;不修改原对象;易读。与 assign 类似,不处理嵌套;浏览器兼容需 Babel。React/Vue 组件 props 合并、快速克隆。原生(ES6)
Lodash _.merge()递归合并源对象到目标对象,支持深层嵌套。深合并处理嵌套对象(如数组/子对象);自定义合并逻辑。需要引入库(增加包体积);性能稍低。复杂数据结构,如 API 响应或配置深层合并。npm install lodash
自定义递归函数手动实现递归遍历属性,合并对象。深合并高度自定义(如忽略某些键、处理特殊类型);无外部依赖。代码复杂,易出错;性能依赖实现。轻量项目、不想引入库的场景。原生

关键概念解释

二、代码示例(从简单到复杂)

假设有两个对象:

constobj1={a:1,b:{x:10},c:[1,2]};constobj2={a:2,b:{y:20},c:[3]};
  1. Object.assign() 示例(浅合并)

    constmerged=Object.assign({},obj1,obj2);// 用空对象作为目标,避免修改原对象console.log(merged);// { a: 2, b: { y: 20 }, c: [3] } // 注意 b 和 c 被整体覆盖
  2. Spread Operator 示例(浅合并)

    constmerged={...obj1,...obj2};console.log(merged);// { a: 2, b: { y: 20 }, c: [3] } // 同上,浅合并
  3. Lodash _.merge() 示例(深合并)

    import{merge}from'lodash';// 或全导入 import _ from 'lodash';constmerged=merge({},obj1,obj2);console.log(merged);// { a: 2, b: { x: 10, y: 20 }, c: [1, 2, 3] } // 嵌套合并,数组追加
  4. 自定义深合并函数示例(递归实现)

    functiondeepMerge(target,source){if(typeoftarget!=='object'||typeofsource!=='object')returnsource;for(constkeyinsource){if(source.hasOwnProperty(key)){if(typeofsource[key]==='object'&&source[key]!==null){target[key]=deepMerge(target[key]||(Array.isArray(source[key])?[]:{}),source[key]);}else{target[key]=source[key];}}}returntarget;}constmerged=deepMerge({},obj1,obj2);console.log(merged);// { a: 2, b: { x: 10, y: 20 }, c: [3] } // 注意:数组被覆盖,可自定义追加逻辑
三、最佳实践(2026年社区共识)
  1. 优先选择内置方法:对于浅合并,用 Spread Operator(更现代、易读);Object.assign() 适合多对象或旧环境。

  2. 处理深合并:内置方法不支持深层,用 Lodash _.merge()(生产级推荐);或自定义函数(轻量,但测试充分)。避免 JSON.parse/stringify(不支持函数/Date/RegExp 等)。

  3. 避免修改原对象:总是用空对象 {} 作为目标(e.g., Object.assign({}, …) 或 { …obj1, …obj2 }),保持不可变性(Immutable),尤其在 React 等框架中。

  4. 性能考虑:浅合并更快(O(n)),深合并递归可能慢(大对象慎用)。在高性能场景,先浅后手动深。

  5. 特殊类型处理:函数/原型链/Getter/Setter 不适合简单合并,用 Object.getOwnPropertyDescriptors() + Object.defineProperties()。

  6. 数组合并:对象属性是数组时,浅合并覆盖整个数组;深合并可自定义(如 concat 或 Set 去重)。

  7. 框架集成:在 React/Vue 中,常用 Spread 合并 props/state;在 Node.js 项目,Lodash 更常见。

  8. 测试与边缘case:处理 null/undefined、非对象输入;用 TypeScript 添加类型检查(e.g., Record<string, any>)。

四、注意事项 & 常见坑

掌握这些,你就能高效处理对象合并了!如果你有具体场景(如深合并数组),欢迎补充,我可以给出更针对性代码~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1174201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PW4584A 2 节锂电池充电芯片实操选型:PCB 布局优化

第一次画PW4584A芯片的电路图,这是一款USB输入给两节串联锂电池充电管理芯片,5V输入升压到8.4V1A,通过资料上面说的效率90%,根据公式:输出功率➗效率=输入功率,8.4V1A=8.4W再除以90%=9.33W输入功率,再除以输入电…

JavaEE要想学得好,【Java spring】少不了,稳扎稳打学JavaEE

JavaEE要想学得好&#xff0c;【Spring全家桶】绝对少不了&#xff01; 稳扎稳打学JavaEE的正确姿势&#xff08;2026年最实用路线&#xff09; 一句话总结当前真实情况&#xff1a; JavaEE ≠ Servlet JSP 了 现在的JavaEE ≈ Spring全家桶 云原生 分布式技术栈 绝大多数…

【AI大模型开发】-基于向量数据库的PDF智能问答系统(实战)

ChatPDF-Faiss&#xff1a;基于向量数据库的PDF智能问答系统 一、项目概述 ChatPDF-Faiss是一个基于向量数据库技术的PDF智能问答系统&#xff0c;它能够将PDF文档内容转换为向量表示并存储在FAISS向量数据库中&#xff0c;用户可以通过自然语言提问获取文档中相关信息的精确…

警惕新型网络攻击:伪装ChatGPT指令传播MacStealer恶意软件

仅限会员阅读 网络攻击警告&#xff1a;MacStealer恶意软件通过伪造ChatGPT指令传播 AI前沿观察 关注 | 阅读时间约2分钟 3天前发布 请按回车键或点击查看完整图片 安全研究人员发现&#xff0c;攻击者正在利用ChatGPT诱骗Mac用户将命令行粘贴到终端中&#xff0c;从而安装恶意…

1毛钱鸡蛋月入百万的生意经

鸡蛋一毛钱一斤&#xff0c;月营业额却能做到一百多万&#xff0c;这听起来像是天方夜谭&#xff0c;却是一个真实发生在社区生鲜店里的商业案例。一家95后姑娘经营的店铺&#xff0c;在竞争激烈的老小区中&#xff0c;不仅站稳了脚跟&#xff0c;还让周边好几家同行陆续关门。…

《C++ 递归、搜索与回溯》第2-3题:合并两个有序链表,反转链表

《C 递归、搜索与回溯》第2-3题&#xff1a;合并两个有序链表 & 反转链表 &#xff08;2026年清晰 优雅写法推荐&#xff09; 这两道题都是链表操作的经典题目&#xff0c;同时也是考察递归思维和迭代思维转换的绝佳练习题。下面给出最常用、最清晰的几种写法&#xff0c…

绥化市兰西望奎明水英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

在雅思备考热潮中,绥化市兰西、望奎、明水三地考生普遍面临雅思培训选课难、提分无方向、考试适配性不足等核心痛点。如何筛选出优质靠谱的教育机构,获取实用的提分技巧与个性化备考方案,实现高分目标,成为考生和家…

大兴安岭加格达奇松岭新林呼中英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

在全球化留学热潮下,雅思成绩已成为大兴安岭地区(含加格达奇、松岭、新林、呼中)学子出国深造的核心门槛。然而,本地雅思培训市场存在资源稀缺、优质机构难甄别等问题,多数考生深陷雅思培训选课迷茫、考试提分乏力…

前端基础知识

前端基础知识完整梳理&#xff08;2026年实用版&#xff09; 适合0-2年前端从业者快速查漏补缺 / 面试复习 / 自学路线规划 一、前端知识体系层级图&#xff08;2026主流认知&#xff09; ┌──────────────────────────────┐ │ 浏览…

使用 Java 实现一个简单且高效的任务调度框架

使用 Java 实现一个简单且高效的任务调度框架&#xff08;2026年实用版&#xff09; 任务调度框架是后台系统中的核心组件&#xff0c;用于管理定时任务、延迟任务、周期任务等。Java 生态中已有 Quartz、Spring Task 等成熟框架&#xff0c;但如果你想从零实现一个简单、高效…

免费网站进阶!——InfinityFree创建数据库教程 - Sail-With

本文讲述了如何在 "InfinityFree" 中创建数据库💖InfinityFree 简介 InfinityFree是一个提供免费虚拟主机服务的平台。每个账户可创建3个站点,支持自定义域名(需使用其提供的二级域名) 1 ⭐创建网站详见…

基于 Spring Boot 的 Web 三大核心交互案例精讲

基于 Spring Boot 的 Web 三大核心交互案例精讲 &#xff08;2026年最实用写法 企业真实场景&#xff09; 在 Spring Boot Web 开发中&#xff0c;真正决定项目质量和维护难度的&#xff0c;往往不是写了多少 Controller&#xff0c;而是你是否真正掌握了以下三大核心交互场景…

大兴安岭呼玛塔河漠河英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

在全球化留学热潮下,雅思成绩已成为大兴安岭、呼玛、塔河、漠河地区学子出国深造的核心门槛,然而本地考生普遍面临雅思培训优质资源匮乏、选课迷茫、提分路径模糊等痛点。如何筛选靠谱实用的教育机构,获取高效提分技…

2026年母线槽厂家推荐榜:宝应东茂电气全系供应耐火/密集/封闭/管型母线槽,适配多场景电力传输 - 品牌推荐官

在电力传输领域,母线槽与管型母线作为核心设备,其性能直接影响系统稳定性与安全性。宝应东茂电气有限公司凭借技术积累与产品创新,成为行业关注的焦点。该公司专注母线槽与管型母线研发制造,构建了从产品设计到技术…

他到底喜欢我吗?赛博塔罗Java+前端实现,一键解答!

// 后端&#xff1a;Spring Boot 实现赛博塔罗API // 项目结构&#xff1a; // - pom.xml // - src/main/java/com/example/TarotApplication.java // - src/main/java/com/example/controller/TarotController.java // - src/main/java/com/example/model/TarotCard.java // -…

2026年管道坡口机厂家实力推荐榜:深圳凯德盛全系供应,覆盖钢板/平板/便携式等10类机型 - 品牌推荐官

在焊接辅助设备领域,深圳凯德盛机械设备有限公司凭借全链条技术积累与市场深耕,成为管道坡口机行业的标杆企业。其产品线覆盖管道坡口机、内涨式坡口机、钢板坡口机、平板坡口机、便携式管道坡口机、手提式坡口机、管…

2026年铝板厂家实力推荐榜:5754/6061/氧化/1060/3003/冲孔/5083/5052铝板全系供应,上海岱通铝业领衔 - 品牌推荐官

在工业材料领域,铝板因其轻量化、耐腐蚀、易加工等特性,广泛应用于航空航天、汽车制造、建筑装饰、电子电器等多个行业。随着市场需求的多元化发展,铝板的种类与规格不断丰富,其中5754铝板、6061铝板、氧化铝板、1…

【C++】哈希扩展——位图和布隆过滤器的介绍与实现

【C】哈希扩展——位图和布隆过滤器的介绍与实现&#xff08;2026年实用版&#xff09; 哈希扩展是数据结构中的高频话题&#xff0c;尤其在海量数据场景&#xff08;如缓存、去重、搜索&#xff09;。位图&#xff08;Bitmap&#xff09; 和 布隆过滤器&#xff08;Bloom Fil…

Proxmox VE Helper-Scripts版本更新测试计划:验证矩阵 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

重新定义需求分析:从“写文档”回归“造价值” - 实践

重新定义需求分析:从“写文档”回归“造价值” - 实践2026-01-17 16:48 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; d…