降低复杂数组合并内存开销最有效的方式是直接修改目标对象而非创建新结构;优先用 Object.assign 原地合并,避免 concat 或展开语法,大数组用 push.apply 或循环填充。

直接修改目标对象,避免创建新结构,是降低复杂数组合并内存开销最有效的方式。关键不在“怎么合”,而在“不额外造”。
优先用 Object.assign 做原地合并
当多个对象结构扁平、字段无冲突,且允许修改原始对象时,Object.assign(target, source1, source2) 是首选。它不分配新对象内存,只把源对象的可枚举属性复制到已有目标对象上。
- 适合场景:配置合并、临时数据组装、服务端响应字段补全
- 注意点:第一个参数 target 会被直接修改;若需保留原对象,可传空对象作为 target,如
Object.assign({}, a, b)—— 此时虽仍创建一个新对象,但仅一个,比展开语法{...a, ...b}更可控 - 避免误用:不要对深层嵌套对象直接用,它只做浅拷贝,深层引用仍共享
深层合并慎用递归,改用分步+复用
真正吃内存的是深度克隆与递归合并(如 Lodash 的 merge)。若必须深层合并,可拆解为两步:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先用
JSON.stringify + JSON.parse快速深克隆(仅限纯数据,不含函数、undefined、Date 等) - 再用
Object.assign或手动遍历逐层覆盖,避免每次调用都新建中间对象 - 更优方案:对高频合并结构(如 API 返回的固定 schema),预建“模板对象”,每次
Object.assign(template, newData)复用同一内存块
数组合并避免 concat 和展开,改用 push.apply 或原地填充
合并两个大数组时,[...arr1, ...arr2] 或 arr1.concat(arr2) 都会生成全新数组,内存翻倍。可用以下低开销方式:
立即学习“Java免费学习笔记(深入)”;
-
arr1.push(...arr2):直接向 arr1 尾部追加,不创建新数组(注意:arr2 过大可能触发“最大参数个数”限制) - 兼容大数组:用 for 循环
for (let i = 0; i - 若需保留原数组且合并频繁,考虑使用 数组池(Array Pool):预先分配若干固定长度数组,合并前 acquire 一个,填完 release 回收,减少 GC 压力
用 Normalizr 提前规整结构,减少运行时合并
前端常因嵌套数据反复合并(如用户+订单+商品混在一起)导致性能下降。Normalizr 的作用不是合并,而是提前摊平关系:
- 一次解析,生成 entities(按 id 索引的对象字典)和 result(id 列表),后续只需查表拼接,无需实时合并对象
- 避免定义冗余关系,例如只 normalize 用户和订单,不把订单项也独立 entity 化,除非真有跨订单聚合需求
- ID 字段尽量用短字符串或数字,避免长 UUID 增加 Map/对象键内存占用

















