javascript对象深度复制推荐structuredclone(),兼容旧环境可用递归+weakmap或fast-copy;深合并需手写递归或用lodash的_.merge();清空嵌套对象宜递归遍历赋值。

JavaScript 中对象的深度复制与合并不能靠单一 API 一步到位,需根据场景选择组合方案。核心在于区分“浅层”与“深层”行为——原生方法默认只处理第一层,嵌套结构必须额外干预。
深度复制:避开 JSON 的坑,用现代原生方案
JSON.parse(JSON.stringify(obj)) 看似简单,但会丢失函数、undefined、Symbol、Date、RegExp、Map、Set 和循环引用,实际项目中不建议用于生产环境。
推荐优先使用 structuredClone()(2022 年起进入标准,现代浏览器和 Node.js 17+ 均支持):
- 能正确处理 Date、RegExp、Map、Set、ArrayBuffer、TypedArray、Error、BigInt 等内置类型
- 自动识别并安全处理循环引用
- 不拷贝函数、undefined、Symbol(这是设计行为,符合多数不可序列化场景)
- 用法极简:
const clone = structuredClone(original)
若需兼容旧环境(如 IE 或 Node.js fast-copy(专为性能优化,2026 年已广泛用于中后台系统)。
对象合并:浅合并是常态,深合并需明确意图
原生没有直接叫 “deepMerge” 的 API,所有“深合并”都是基于浅合并逻辑 + 递归实现的组合方案。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
浅合并(常用且高效):用
{...obj1, ...obj2}或Object.assign({}, obj1, obj2)。同名属性后者覆盖前者,仅作用于顶层键 -
深合并(需谨慎):当两个对象都有
user: { profile: { name: 'A' } }这类嵌套结构,希望合并后是{ profile: { name: 'A', age: 25 } }而非整个替换profile,就必须递归遍历
原生无内置深合并,可靠做法是:
- 小项目:手写递归 merge 函数,对每个 key 判断值类型,对象/数组则递归合并,其余直接覆盖
- 中大型项目:用 Lodash 的 _.merge()(支持自定义合并逻辑)或 deepmerge(零依赖、专注合并、API 极简)
深度复制后再合并:典型实用路径
很多场景本质是“先隔离再叠加”,比如表单重置、配置叠加、状态快照还原。这时应分两步:
- 先用
structuredClone(defaultConfig)得到一份干净副本 - 再用
Object.assign(clone, userOverrides)或_.merge(clone, userOverrides)叠加定制项
这样既避免污染原始模板,又保留了浅合并的简洁性;若 userOverrides 本身含嵌套结构且需深度融合,再换用 _.merge 即可。
清空嵌套对象值:递归比拷贝更直接
清空不是复制也不是合并,而是“重置”。对含多层嵌套的对象(如 { name: '', address: { city: '', zip: '' } }),最稳妥方式是递归遍历:
- 遍历每个 key,若值为对象且非 null,则递归调用清空函数
- 否则统一赋值为空字符串(或 null/undefined,依业务而定)
- 避免依赖“深拷贝模板再赋值”,减少内存开销和初始化延迟
示例片段:
function clearValues(obj) {<br> Object.keys(obj).forEach(key => {<br> if (obj[key] !== null && typeof obj[key] === 'object') {<br> clearValues(obj[key]);<br> } else {<br> obj[key] = '';<br> }<br> });<br>}大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










