深拷贝和浅拷贝的区别?如何实现深拷贝?
一、什么是浅拷贝Shallow Copy浅拷贝只复制对象的第一层嵌套对象仍然共享引用。示例const obj { name: Tom, address: { city: Beijing } } const copy { ...obj } copy.address.city Shanghai console.log(obj.address.city) // Shanghai原因obj ├ name └ address → 指向同一个内存浅拷贝只复制obj.address 的引用二、什么是深拷贝Deep Copy深拷贝递归复制对象所有层级生成完全独立的新对象。示例const obj { name: Tom, address: { city: Beijing } } const copy deepClone(obj) copy.address.city Shanghai console.log(obj.address.city) // Beijing结构obj.address ! copy.address三、浅拷贝常见实现方式1 Object.assignconst copy Object.assign({}, obj)2 展开运算符const copy { ...obj }3 数组浅拷贝const arr [1,2,3] const copy1 arr.slice() const copy2 arr.concat() const copy3 [...arr]四、深拷贝常见方法方法1 JSON序列化最常见const copy JSON.parse(JSON.stringify(obj))优点简单缺点不能拷贝function undefined Symbol Date RegExp 循环引用示例const obj { fn: () {} } JSON.parse(JSON.stringify(obj)) // fn丢失方法2 structuredClone现代方法 ⭐推荐浏览器原生 APIconst copy structuredClone(obj)优点支持 Map Set Date ArrayBuffer缺点旧浏览器不支持方法3 lodash使用Lodashimport _ from lodash const copy _.cloneDeep(obj)优点稳定 支持复杂对象方法4 手写深拷贝面试最爱function deepClone(obj) { if (obj null || typeof obj ! object) { return obj } const copy Array.isArray(obj) ? [] : {} for (let key in obj) { if (obj.hasOwnProperty(key)) { copy[key] deepClone(obj[key]) } } return copy }五、解决循环引用高级面试如果对象这样const obj {} obj.self obj普通递归会无限递归解决使用WeakMapfunction deepClone(obj, hash new WeakMap()) { if (obj null || typeof obj ! object) { return obj } if (hash.has(obj)) { return hash.get(obj) } const clone Array.isArray(obj) ? [] : {} hash.set(obj, clone) for (let key in obj) { clone[key] deepClone(obj[key], hash) } return clone }六、浅拷贝 vs 深拷贝总结对比浅拷贝深拷贝拷贝层级第一层所有层引用对象共享独立性能快慢实现简单复杂七、真实开发怎么选一般浅拷贝 90% 深拷贝 10%原因React / Vue 都鼓励不可变数据更新例如setState({ ...state, user: { ...state.user, name: Tom } })八、面试标准回答背这个可以这样回答浅拷贝只复制对象的第一层属性如果属性值是引用类型则复制的是引用地址因此修改嵌套对象会影响原对象。深拷贝会递归复制对象的所有层级生成一个完全独立的新对象。常见浅拷贝方式有 Object.assign 和展开运算符。深拷贝可以使用 JSON.parse(JSON.stringify)、structuredClone、lodash 的 cloneDeep或者手写递归实现并通过 WeakMap 解决循环引用问题。如果你准备前端面试我可以再给你整理一套JS 高频 100 题大厂版比如防抖和节流call apply bindPromise.allEvent Loop原型链手写 new手写 Promise手写深拷贝终极版基本是字节 / 腾讯 / 阿里 高频题。

相关新闻

LabVIEW实现WebDAV简单物联网范例探索

LabVIEW实现WebDAV简单物联网范例探索

labview webdav简单实用范例(实现简单物联网) 1.主要功能如下: (1)实现客户端文件上传、删除、查询和目录创建等功能(文件上传后可通过网页浏览相关文件,具有较好的便捷性),可辅助实现网站文件浏览等功能。 (2)通过搭建好的软件进行文件上传后…

2026/5/17 10:22:49 阅读更多 →
【算法十九】33. 搜索旋转排序数组 74. 搜索二维矩阵

【算法十九】33. 搜索旋转排序数组 74. 搜索二维矩阵

33. 搜索旋转排序数组 二分&#xff1a; class Solution {public int search(int[] nums, int target) {int n nums.length;if(n 0){return -1;}if(n 1){return nums[0]target?0:-1;}int l 0;int r n-1;while(l<r){int mid l(r-l)/2;if(nums[mid] target){return …

2026/7/3 10:31:34 阅读更多 →
鸽群优化算法PIO优化SVM,建立多特征输入单个因变量输出的拟合预测模型。 程序内注释详细直接...

鸽群优化算法PIO优化SVM,建立多特征输入单个因变量输出的拟合预测模型。 程序内注释详细直接...

鸽群优化算法PIO优化SVM&#xff0c;建立多特征输入单个因变量输出的拟合预测模型。 程序内注释详细直接替换数据就可以用。 程序语言为matlab。 想要的可以加好友我。清晨六点的校园路灯下&#xff0c;一群鸽子正在用独特的交流方式分配觅食区域。这种看似随机的群体行为&…

2026/7/5 21:10:30 阅读更多 →

最新新闻

大型系统的依赖管理与解耦

大型系统的依赖管理与解耦

大型系统的依赖管理与解耦在软件工程领域&#xff0c;构建和维护大型系统是一项复杂且持续的挑战。随着业务需求的膨胀和技术的迭代&#xff0c;系统规模如同滚雪球般增长&#xff0c;模块间的耦合度往往也随之悄然攀升。最终&#xff0c;系统可能变得僵化、脆弱且难以演进&…

2026/7/6 1:07:31 阅读更多 →
深入理解Go语言内存模型与优化

深入理解Go语言内存模型与优化

深入理解Go语言内存模型与优化Go语言以其简洁的语法、强大的并发模型和出色的性能&#xff0c;在现代软件开发中占据了重要地位。然而&#xff0c;要真正释放Go程序的潜力&#xff0c;开发者必须深入理解其内存模型&#xff0c;并掌握相关的优化技巧。Go的内存管理虽然由垃圾回…

2026/7/6 1:05:31 阅读更多 →
松下伺服电子齿轮比计算:从脉冲当量到参数设置的 3 个实战案例

松下伺服电子齿轮比计算:从脉冲当量到参数设置的 3 个实战案例

松下伺服电子齿轮比实战指南&#xff1a;从脉冲当量到参数设置的深度解析在工业自动化领域&#xff0c;伺服系统的精度控制一直是工程师们关注的核心问题。作为松下伺服系统的关键参数之一&#xff0c;电子齿轮比的正确设置直接关系到设备的运动精度和响应速度。本文将从一个全…

2026/7/6 1:05:31 阅读更多 →
V4L2 零拷贝与内存分配机制

V4L2 零拷贝与内存分配机制

在 Linux 嵌入式多媒体与 AI 边缘计算&#xff08;如 RK3588 平台&#xff09;中&#xff0c;为了实现极低延迟和降低 CPU 占用&#xff0c;通常需要打通摄像头&#xff08;Camera&#xff09;、图像格式转换模块&#xff08;RGA/GPU&#xff09;、AI 加速器&#xff08;NPU&am…

2026/7/6 1:01:30 阅读更多 →
KYC形同虚设?揭秘黑产绕过金融机构身份核验全套手法

KYC形同虚设?揭秘黑产绕过金融机构身份核验全套手法

KYC&#xff08;Know Your Customer&#xff0c;了解你的客户&#xff09;并非信贷行业的专属课题&#xff0c;而是数字经济时代每一个需要建立"信任关系"的商业场景所共有的核心命题。无论是金融、电商、出行还是短视频&#xff0c;当平台试图确认"站在对面的究…

2026/7/6 1:01:30 阅读更多 →
Agentic Testing实战:自主AI测试代理架构与实现

Agentic Testing实战:自主AI测试代理架构与实现

# Agentic Testing实战&#xff1a;自主AI测试代理架构与实现## 一、背景与挑战&#xff1a;传统测试自动化的天花板当CI/CD流水线每天触发数百次测试执行&#xff0c;当微服务架构的API变更频率以分钟计&#xff0c;传统基于录制回放或关键字驱动的测试框架逐渐暴露出结构性缺…

2026/7/6 1:01:30 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性&#xff1a;5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域&#xff0c;单元测试是保证代码质量的重要环节。当应用涉及数据库操作时&#xff0c;测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南&#xff1a;用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南&#xff1a;告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况&#xff1a;下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻