JS深浅拷贝彻底讲明白,不要再被面试题难住
做前端开发的朋友几乎没人能避开JS深浅拷贝的问题。不管是日常业务开发还是前端面试这都是高频考点。很多人工作两三年依然只会死记硬背概念遇到复杂嵌套对象拷贝、修改原数据影响新数据的bug还是一脸懵。我刚入行的时候也踩过超多坑修改新对象数据原对象莫名被改动排查半天找不到原因面试被问深浅拷贝区别、手写深浅拷贝当场卡壳。其实深浅拷贝根本没有那么复杂核心差异就一句话浅拷贝只拷贝表层深拷贝复制完整数据彻底断绝新旧数据关联。今天我结合实战代码面试考点从零讲透JS深浅拷贝包含原理、场景、手写实现、优缺点分析看完彻底搞定这个知识点再也不用怕面试提问和线上bug。一、先搞懂底层基本数据与引用数据想理解深浅拷贝首先要分清JS的两种数据存储方式这是所有知识点的基础。基本数据类型String、Number、Boolean等直接存在栈内存赋值就是完整复制互不影响而对象、数组这类引用数据类型栈内存只存地址真实数据存在堆内存。我们平时遇到的拷贝问题只针对引用数据类型基本类型不存在深浅拷贝的说法。地址拷贝就是浅拷贝数据完整拷贝就是深拷贝。二、浅拷贝详解只复制表层地址浅拷贝的核心逻辑创建一个新对象遍历原对象的第一层属性简单复制过来。如果属性是基本类型复制数值如果是嵌套对象/数组只复制内存地址新旧数据共用同一个堆内存。这就导致一个致命问题浅拷贝后修改嵌套数据新旧对象会互相影响。日常开发常用的浅拷贝方法Object.assign、扩展运算符...、数组slice、concat下面给大家实测演示// 原始嵌套对象 const oldObj { name: 前端开发者, age: 25, info: { city: 上海 } }; // 扩展运算符实现浅拷贝 const newObj {...oldObj}; // 修改基本类型属性 newObj.age 26; // 修改嵌套引用属性 newObj.info.city 北京; console.log(oldObj.age); // 25 基本类型互不影响 console.log(oldObj.info.city); // 北京 嵌套数据被修改大家可以清晰看到表层基本数据修改互不影响但嵌套对象改动原数据同步变化这就是浅拷贝的最大弊端。三、深拷贝详解完全切断数据关联深拷贝就是彻底的完整复制不管多少层嵌套都会递归复制所有数据在堆内存中开辟全新空间。拷贝完成后新数据和原数据完全独立互不干扰。日常开发最简单的深拷贝方式就是JSON序列化转换代码极简开箱即用const oldObj { name: 前端开发者, age: 25, info: { city: 上海 } }; // JSON序列化实现深拷贝 const newObj JSON.parse(JSON.stringify(oldObj)); // 修改嵌套数据 newObj.info.city 北京; // 原数据无变化彻底独立 console.log(oldObj.info.city); // 上海但这个方法有明显缺陷也是面试常问考点无法拷贝undefined、function、正则、Symbol会丢失数据不支持循环引用。简单业务场景够用复杂场景不推荐。四、手写通用深浅拷贝面试必背1、手写浅拷贝遍历对象第一层属性逐一赋值适配对象和数组function shallowClone(obj) { // 非引用类型直接返回 if (typeof obj ! object || obj null) return obj; // 创建对应类型空对象/数组 const newObj Array.isArray(obj) ? [] : {}; // 遍历第一层赋值 for (let key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] obj[key]; } } return newObj; }2、手写递归深拷贝完整版通过递归遍历所有层级属性彻底复制数据解决嵌套问题适配绝大多数业务和面试场景function deepClone(obj) { if (typeof obj ! object || obj null) return obj; // 处理日期、正则特殊对象 if (obj instanceof Date) return new Date(obj); if (obj instanceof RegExp) return new RegExp(obj); const newObj Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { // 递归拷贝所有层级 newObj[key] deepClone(obj[key]); } } return newObj; }五、深浅拷贝使用场景总结避坑关键很多人盲目用深拷贝导致代码性能冗余其实按需选择才是最优解用浅拷贝数据只有单层结构、无嵌套对象数组追求执行速度轻量化数据拷贝。用深拷贝多层嵌套复杂数据、表单回显、列表编辑、状态缓存需要彻底隔离新旧数据防止原数据污染。

相关新闻

一个人全栈开发,有没有必要做前后端分离?

一个人全栈开发,有没有必要做前后端分离?

于现代网络开发里头, 前端与后端分离已然成一种时常出现的构架模式特在团队协作以及大规模项目当中, 然而, 针对一名全栈开发者而言是不是得要做前后端分离呢, 此文会从前后端分离的概念, 优点和缺点以及实际例子等层面去详尽钻研辅助你更优地领会这个问题并做出契合自身的抉择…

2026/8/24 14:39:07 阅读更多 →
Defender Control:如何永久禁用 Windows Defender 并完整恢复

Defender Control:如何永久禁用 Windows Defender 并完整恢复

Defender Control:如何永久禁用 Windows Defender 并完整恢复 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/de/defender-control…

2026/8/24 14:39:07 阅读更多 →
【单片机课程设计/毕业设计】基于 STM32 与 JDY-31 蓝牙模块的智能通风控制系统研发 基于 STM32 的 OLED 实时环境显示智能风扇控制系统设计(018504)

【单片机课程设计/毕业设计】基于 STM32 与 JDY-31 蓝牙模块的智能通风控制系统研发 基于 STM32 的 OLED 实时环境显示智能风扇控制系统设计(018504)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/24 14:39:07 阅读更多 →

最新新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
缓存穿透、击穿与雪崩:原理、区别与Spring Boot+Redis实战解决方案

缓存穿透、击穿与雪崩:原理、区别与Spring Boot+Redis实战解决方案

大家好,我是专注于后端技术分享的博主。在构建高并发系统时,缓存是提升性能、保护数据库的利器。然而,如果使用不当,缓存也可能成为系统稳定性的“阿喀琉斯之踵”。缓存穿透、击穿和雪崩是三个高频出现且极易混淆的故障场景&#…

2026/8/25 23:59:39 阅读更多 →
免费AI大模型调教指南:打造专属网文写作助手

免费AI大模型调教指南:打造专属网文写作助手

1. 先搞清楚“AI小说扩展模式”到底能帮你做什么如果你是一个刚开始写网文、或者卡在L3级别以下的作者,最头疼的可能是情节推进不下去、人物对话干瘪,或者世界观设定不够丰满。自己对着空白文档硬憋,效率很低。这时候,一个能理解你…

2026/8/25 23:59:39 阅读更多 →
Hermes接入团队协作后,我推翻了三个效率假设

Hermes接入团队协作后,我推翻了三个效率假设

聊《Hermes真能提效吗?先看流程里最慢的那一步》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要团队把 Hermes 接进项目三个月后,交付速度没有提升反而慢了。复盘后发现,最先…

2026/8/25 23:59:39 阅读更多 →
约会App算法如何侵蚀婚恋观

约会App算法如何侵蚀婚恋观

AI对上周一些中长视频的笔记提取 约会App算法如何侵蚀婚恋观 ① 现象悖论:GDP增长与生育率下降形成全球性矛盾,30岁群体普遍无子女反映深层社会转变 ② 社交恐惧:18岁人群回避线下社交因"全景监狱"效应,担心搭讪失败被全…

2026/8/25 23:58:39 阅读更多 →
Construct Computer 核心应用场景与落地指南

Construct Computer 核心应用场景与落地指南

在处理海量数据或复杂计算任务时,单台服务器的算力瓶颈往往让人束手无策。无论是影视后期的高帧率渲染,还是科研领域的分子动力学模拟,一旦数据量级突破临界点,传统单机模式不仅耗时漫长,更面临着内存溢出、硬件过热甚…

2026/8/25 23:58:39 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/24 20:22:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/24 11:20:22 阅读更多 →