javascript无原生部分深浅拷贝方法,需手动遍历属性:对指定键名(如data、options)或可序列化类型用structuredclone深拷贝,其余直接赋值实现浅拷贝。

JavaScript 中没有原生的“部分深拷贝部分浅拷贝”方法,但可以通过自定义逻辑控制哪些字段深拷贝、哪些字段浅拷贝。核心思路是:手动遍历对象属性,对指定键名或类型走深拷贝(如递归、structuredClone、JSON 序列化等),其余直接赋值(即浅拷贝)。
按字段名控制深/浅拷贝
适用于你明确知道哪些字段需要保留引用(如 DOM 元素、函数、大型缓存对象),哪些必须隔离(如配置对象、嵌套数据)。
- 用 Object.keys() 或 for...in 遍历源对象
- 对白名单字段(如
config,meta)调用深拷贝函数(如structuredClone或自定义递归函数) - 对黑名单字段(如
el,cache,onSubmit)直接赋值(target[key] = source[key])
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function partialDeepCopy(obj, deepKeys = ['data', 'options']) {
const result = {};
for (const key in obj) {
if (deepKeys.includes(key) && typeof obj[key] === 'object' && obj[key] !== null) {
result[key] = structuredClone(obj[key]); // 或用 JSON.parse(JSON.stringify())(有局限)
} else {
result[key] = obj[key]; // 浅拷贝:引用不变
}
}
return result;
}
const original = {
data: { a: 1, b: { c: 2 } },
options: { timeout: 5000 },
el: document.body,
onSubmit: () => console.log('submit')
};
const copied = partialDeepCopy(original, ['data', 'options']);
console.log(copied.data === original.data); // false(深拷贝)
console.log(copied.el === original.el); // true(浅拷贝,同一 DOM 节点)
按数据类型自动判断
适合通用场景:对可序列化的值(plain object、array、Date、Map、Set 等)深拷贝;对不可序列化或需复用的对象(函数、RegExp、Element、WeakMap 等)保持引用。
- 利用 structuredClone 的能力(现代浏览器支持),它本身会跳过不可克隆值并抛错,所以需提前过滤
- 更稳妥做法:先检查类型,
typeof === 'function'、obj instanceof Element、obj instanceof RegExp→ 浅拷贝;其余走深拷贝
使用代理 + 懒拷贝策略(进阶)
当对象很大、且多数字段很少被访问时,可结合 Proxy 实现“按需深拷贝”:
- 返回一个代理对象,读取某个属性时再决定是否深拷贝该字段
- 配合缓存(WeakMap 存已拷贝值),避免重复操作
- 适合大数据表单、配置中心等场景,兼顾性能与隔离性
注意事项和常见坑
- JSON 方法不万能:会丢掉函数、undefined、Symbol、循环引用、Date(变成字符串)、正则等
- structuredClone 有兼容性:Node.js ≥17.0,浏览器需较新版本;不支持某些内置对象(如 Promise、Error)
- 循环引用需处理:自定义深拷贝函数务必用 Map 缓存已拷贝对象,否则栈溢出
- getter/setter 和不可枚举属性:Object.assign / 展开符无法复制,需用 Object.getOwnPropertyDescriptors + defineProperty
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










