当前位置: 首页 > news >正文

深拷贝与浅拷贝的区别?如何手写实现一个深拷贝?

导语:
“深拷贝 VS 浅拷贝”是前端面试中绕不开的经典问题,既能考察 JavaScript 基础功,又能延伸至手写代码、递归、循环引用处理等进阶话题。本文从面试官视角解析其考察重点,并详解如何手写一个实用的深拷贝函数,助你面试中脱颖而出。


一、面试主题概述

在 JavaScript 中,引用类型(如对象、数组)在赋值或传参时常常引发“浅拷贝”或“深拷贝”的问题。尤其在 React、Vue 等响应式框架下,数据变化与状态同步息息相关,若不理解这两者的本质差异,很容易引发业务 bug。

本主题常作为基础知识或代码题出现,后续还可能结合闭包、原型、递归、JSON 等深入提问,是体现候选人代码能力和思维深度的优质考点。


二、高频面试题汇总

  1. 什么是浅拷贝和深拷贝?两者有什么区别?
  2. 哪些常见方法可以实现浅拷贝?
  3. 用 JSON 方法实现深拷贝有什么局限性?
  4. 如何手写一个通用的深拷贝函数?
  5. 深拷贝中如何处理循环引用问题?

三、重点题目详解

题目一:
什么是浅拷贝和深拷贝?举例说明。

const obj1 = { name: 'Tom', info: { age: 25 } };// 浅拷贝
const shallowCopy = Object.assign({}, obj1);
shallowCopy.info.age = 30;console.log(obj1.info.age); // 输出:30(原对象被影响)

解析:

  • 浅拷贝:只拷贝对象的第一层属性,若属性为引用类型(如对象、数组),则拷贝的是引用地址。
  • 深拷贝:递归拷贝所有层级的数据,原对象与拷贝对象彻底隔离。

题目二:
使用 JSON.parse(JSON.stringify()) 实现深拷贝,有哪些问题?

const obj = {name: 'Tom',birthday: new Date(),func: () => {},undef: undefined,symbol: Symbol('s'),circular: null
};obj.circular = obj;const copy = JSON.parse(JSON.stringify(obj));console.log(copy); // 部分属性丢失

解析:

使用 JSON 方法虽然快捷,但存在以下缺陷

  • 函数、undefinedSymbol 类型会被忽略;
  • Date 类型会变成字符串;
  • 不支持循环引用,会报错;
  • 不适用于特殊对象如 Map、Set、RegExp。

面试官关注:
此题考察候选人是否对“工具函数的边界”有足够认识,避免在项目中使用时踩坑。


题目三:
如何手写一个支持循环引用的深拷贝函数?

function deepClone(obj, map = new WeakMap()) {if (obj === null || typeof obj !== 'object') return obj;if (map.has(obj)) return map.get(obj); // 处理循环引用let clone = Array.isArray(obj) ? [] : {};map.set(obj, clone); // 记录已克隆的对象for (let key in obj) {if (obj.hasOwnProperty(key)) {clone[key] = deepClone(obj[key], map);}}return clone;
}// 测试循环引用
const a = { name: 'A' };
a.self = a;const b = deepClone(a);
console.log(b); // 无堆栈溢出,成功复制

解析:

  • 使用 WeakMap 缓存已拷贝对象,避免递归陷入死循环;
  • 判断基础类型直接返回;
  • 使用 Array.isArray() 兼容数组和对象;
  • 保留引用结构,适合实际项目应用。

拓展建议:

  • 若需支持更多类型(如 DateRegExpMapSet 等),可进行类型判断扩展;
  • 若对性能有高要求,需避免过度递归(例如处理大型嵌套结构时)。

四、面试官视角与加分项

考察目的:

  • 是否理解 JS 中引用与内存的机制;
  • 能否区别使用“引用复制”“浅拷贝”“深拷贝”三种方式;
  • 能否用清晰逻辑实现一个通用工具函数,具备递归与边界处理能力;
  • 在实际开发中是否具备“避免踩坑”的工程化思维。

如何加分:

  • 回答时主动举出项目中出现“数据污染”的真实场景;
  • 对性能考虑(是否滥用深拷贝)有思考;
  • 能使用 WeakMap 处理循环引用,并说明其为何优于普通 Map
  • 了解 Lodash、Rambda 等库中 cloneDeep 的实现方式。

五、总结与建议

  • 深浅拷贝的本质在于“是否复制内存地址引用”;
  • 浅拷贝适用于简单结构、性能敏感场景;
  • 深拷贝适用于复杂嵌套数据,需谨慎使用以免性能损耗;
  • 推荐封装自己的 deepClone 工具函数或使用成熟库,在项目中按需使用;
  • 面试中不仅要会用,更要能讲清楚“原理+场景+边界+优化”,才能拿下高分。

一句话记忆:

浅拷贝复制表面,深拷贝深入内核;JSON 简便却有限,循环引用用 WeakMap!


文章转载自:

http://0cMxYKLO.yxdrf.cn
http://SEYjHJ0j.yxdrf.cn
http://MnhYkdvr.yxdrf.cn
http://jBHtp1fq.yxdrf.cn
http://CtqdgLty.yxdrf.cn
http://3M143GrV.yxdrf.cn
http://bvXNlL2Y.yxdrf.cn
http://AK5U2XX5.yxdrf.cn
http://iV6VDZjs.yxdrf.cn
http://Ql68AyWE.yxdrf.cn
http://nBZ5LOHl.yxdrf.cn
http://RUZy0qYt.yxdrf.cn
http://eG6qTIzC.yxdrf.cn
http://N19gxKo7.yxdrf.cn
http://U24ozhAI.yxdrf.cn
http://jVYWTWUT.yxdrf.cn
http://6Fc4Bowp.yxdrf.cn
http://t3u5HA88.yxdrf.cn
http://kVjMJBB4.yxdrf.cn
http://UB3Sw006.yxdrf.cn
http://3Ezejc2s.yxdrf.cn
http://H3fdeoKu.yxdrf.cn
http://hBjQD8t1.yxdrf.cn
http://zrSias9O.yxdrf.cn
http://Xs1d6YkJ.yxdrf.cn
http://Ld06R3Nz.yxdrf.cn
http://GHjvl7oa.yxdrf.cn
http://y7u4WH9d.yxdrf.cn
http://KYNInfbN.yxdrf.cn
http://VrJACjj8.yxdrf.cn
http://www.dtcms.com/a/229652.html

相关文章:

  • 基于51单片机和8X8点阵屏、独立按键的填充消除类小游戏
  • Linux操作系统-命令基础
  • 【leetcode-两数之和】
  • el-select 实现分页加载,切换也数滚回到顶部,自定义高度
  • MAU算法流程理解
  • 剑指offer14_二进制中1的个数
  • Nginx 的配置文件
  • VBA模拟进度条
  • 谈C语言变量的作用域,加深对全局变量和局部变量的理解
  • 【判断酒酒花数】2022-3-31
  • 对数正态分布LogNormal
  • DDD 到底是什么? 它试图解决什么核心问题?
  • Day-15【选择与循环】选择结构-if语句
  • 海盗64位GameServer的使用体验
  • 访谈 | 吴恩达全景解读 AI Agents 发展现状:多智能体、工具生态、评估体系、语音栈、Vibe Coding 及创业建议一文尽览
  • Python基于PCA、PCA-kernel、LDA的鸢尾花数据降维项目实战
  • 【深度学习-Day 22】框架入门:告别数据瓶颈 - 掌握PyTorch Dataset、DataLoader与TensorFlow tf.data实战
  • 多模态知识图谱可视化构建(neo4j+python+flask+vue环境搭建与示例)
  • 飞书常用功能(留档)
  • Linux入门(十四)rpmyum
  • 什么是 Docker Compose 的网络(network),为什么你需要它,它是怎么工作的
  • Windows Server部署Vue3+Spring Boot项目
  • 6个月Python学习计划 Day 13 - 文件操作基础
  • 移动网页调试的多元路径:WebDebugX 与其他调试工具的组合使用策略
  • 【搭建 Transformer】
  • 亚马逊Woot提报常见问题第一弹
  • 十五、【测试执行篇】异步与并发:使用 Celery 实现测试任务的后台执行与结果回调
  • Go语言学习-->编译器安装
  • leetcode47.全排列II:HashSet层去重与used数组枝去重的双重保障
  • 种草平台:重新定义购物的乐趣革命