浅拷贝和深拷贝AI
值传递,在vue3中深拷贝的解决方法
- 1. 浅拷贝
- 使用结构赋值
- 使用 `Object.assign`
- 2. 深拷贝
- 使用 `JSON.parse(JSON.stringify())`
- 使用 Lodash 的 `cloneDeep`
- 使用递归函数手动实现深拷贝
- 3. 使用 Vue 3 的响应式系统相关工具
- 使用 `toRaw`
- 使用 `markRaw`
- 4. 使用第三方库
- 使用 `structuredClone`(现代浏览器支持)
- 使用 `immer`
- 总结
在 Vue 3 中,当你希望复制一个对象并确保对新对象的修改不会影响到原对象时,可以使用多种方法来实现这一点。以下是所有常见的解决方法及其适用场景:
1. 浅拷贝
浅拷贝只复制对象的第一层属性,对于嵌套的对象或数组,仍然会引用原始对象中的内容。
使用结构赋值
const original = { a: 1, b: { c: 2 } };
const shallowCopy = { ...original };
shallowCopy.b.c = 3; // 这会影响到原对象中的 `b` 对象
console.log(original.b.c); // 输出 3
使用 Object.assign
const original = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, original);
shallowCopy.b.c = 3; // 这会影响到原对象中的 `b` 对象
console.log(original.b.c); // 输出 3
2. 深拷贝
深拷贝会递归地复制对象的所有层次,包括嵌套的对象和数组,生成一个完全独立的新对象。
使用 JSON.parse(JSON.stringify())
适用于简单的对象结构,但不支持函数、循环引用等复杂情况。
const original = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));
deepCopy.b.c = 3; // 不会影响到原对象
console.log(original.b.c); // 输出 2
使用 Lodash 的 cloneDeep
Lodash 提供了一个强大的工具函数来处理复杂的对象结构。
首先安装 Lodash:
npm install lodash
然后在代码中使用:
import _ from 'lodash';const original = { a: 1, b: { c: 2 } };
const deepCopy = _.cloneDeep(original);
deepCopy.b.c = 3; // 不会影响到原对象
console.log(original.b.c); // 输出 2
使用递归函数手动实现深拷贝
如果你不想依赖外部库,也可以自己实现一个深拷贝函数。
function deepClone(obj) {if (obj === null || typeof obj !== 'object') {return obj;}if (Array.isArray(obj)) {const arrCopy = [];for (let i = 0; i < obj.length; i++) {arrCopy[i] = deepClone(obj[i]);}return arrCopy;}const objCopy = {};for (const key in obj) {if (obj.hasOwnProperty(key)) {objCopy[key] = deepClone(obj[key]);}}return objCopy;
}const original = { a: 1, b: { c: 2 } };
const deepCopy = deepClone(original);
deepCopy.b.c = 3; // 不会影响到原对象
console.log(original.b.c); // 输出 2
3. 使用 Vue 3 的响应式系统相关工具
Vue 3 提供了一些工具函数来处理响应式数据,虽然它们的主要用途不是用于深拷贝,但在某些情况下可能会有所帮助。
使用 toRaw
获取响应式对象的原始对象。
import { reactive, toRaw } from 'vue';const original = reactive({ a: 1, b: { c: 2 } });
const rawOriginal = toRaw(original);
// 注意:toRaw 只是获取原始对象,并不创建副本
使用 markRaw
标记一个对象永远不应该被转换为响应式对象。
import { markRaw } from 'vue';const original = { a: 1, b: { c: 2 } };
const markedRaw = markRaw(original);
// 标记后,Vue 将不会尝试将这个对象变为响应式
4. 使用第三方库
除了 Lodash 之外,还有其他一些流行的第三方库可以帮助你进行深拷贝。
使用 structuredClone(现代浏览器支持)
这是 JavaScript 原生提供的一个方法,支持深拷贝,但需要注意浏览器兼容性。
const original = { a: 1, b: { c: 2 } };
const deepCopy = structuredClone(original);
deepCopy.b.c = 3; // 不会影响到原对象
console.log(original.b.c); // 输出 2
使用 immer
Immer 是一个用于处理不可变数据的库,特别适合处理复杂的状态管理。
首先安装 Immer:
npm install immer
然后在代码中使用:
import produce from 'immer';const original = { a: 1, b: { c: 2 } };
const deepCopy = produce(original, draft => {draft.b.c = 3;
});
console.log(original.b.c); // 输出 2
console.log(deepCopy.b.c); // 输出 3
总结
根据你的具体需求选择合适的拷贝方法:
- 浅拷贝:适合只需要复制对象的第一层属性的情况。
- 深拷贝:适合需要完整复制整个对象树的情况,推荐使用 Lodash 的
cloneDeep或者自己实现递归函数。 JSON.parse(JSON.stringify()):简单快捷,但不支持函数、循环引用等复杂情况。- 第三方库:如 Lodash 和 Immer 提供了更强大且灵活的解决方案。
通过选择合适的方法,你可以确保在修改新对象时不会影响到原对象的数据。
相关文章:
浅拷贝和深拷贝AI
值传递,在vue3中深拷贝的解决方法 1. 浅拷贝使用结构赋值使用 Object.assign 2. 深拷贝使用 JSON.parse(JSON.stringify())使用 Lodash 的 cloneDeep使用递归函数手动实现深拷贝 3. 使用 Vue 3 的响应式系统相关工具使用 toRaw使用 markRaw 4. 使用第三方库使用 str…...
mingw32编译ffmpeg
ffmpeg https://gitee.com/mirrors/ffmpeg.git 使用msys2的mingw32 pacman -S mingw-w64-x86_64-toolchain compile ./confiure --enable-static --disable-shared --enable-gpl --target-oswin32 mingw32-make -j4 提示编译错误,msys2里面的路径是/d/tools/msys2…...
MAVEN解决版本依赖冲突
文章目录 一、依赖冲突概念1、什么是依赖冲突2、依赖冲突的原因3、如何解决依赖冲突 二、查看依赖冲突-maven-helper1、安装2、helper使用1、conflicts的阅读顺序(从下向上看)2、dependencies as List的阅读顺序(从下向上看)3、de…...
地基注解@Controller和@RestController区别
前记:基础啊,区别点重点理解; 在Spring和Spring Boot框架中,Controller和RestController都用于处理HTTP请求,但它们在设计目的和用法上有显著区别。以下是它们的核心区别及示例说明: 1. 核心区别 特性C…...
Linux Bash 单命令行解释 | 文件操作 / 字符串操作 / 重定向
注:本文为 “Linux Bash” 相关文章合辑。 中文引文,未整理。 英文引文,机翻未校。 第一部分:文件操作 1. 清空文件(清除文件大小为 0) $ > file这行命令使用输出重定向操作符 >。输出重定向造成文…...
【零基础入门unity游戏开发——进阶篇】Unity Microphone类处理麦克风相关信息,录制音频并实时处理或保存录制的音频数据
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...
在终端中用code命令打开vscode并加载当前目录了
注册code命令 启动 VSCode 编辑器,按 shift command p输入 shell command,选择 Install ‘code’ command in PATH 选项, 安装code 命令 此操作会把 code 命令添加到系统的环境变量里。 打开 iTerm2 终端 在 iTerm2 中,cd 代码库根目录, …...
无需 Docker 也能下载镜像!轻松获取 Docker 镜像文件!
背景问题 在日常开发或运维工作中,我们经常需要下载 Docker 镜像,但可能会遇到以下问题: 🔹 服务器无法访问 Docker Hub,导致 docker pull 失败。 🔹 Windows 端没有安装 Docker,但仍然需要获…...
ESMFold对决AlphaFold:蛋白质-肽相互作用预测的新进展
今天向大家介绍的这篇文章题目为:“Protein−Peptide Docking with ESMFold Language Model”,近期发表在JCTC上。 本文主要研究 ESMFold 语言模型在蛋白质-肽对接中的应用。通过探索多种对接策略,评估其在预测蛋白质-肽相互作用方面的性能&a…...
win终端添加git-bash,支持linux的shell语法
git的git-bash支持很多linux的语法,比如ll,rm等等,用着很方便,比cmd、ps用着习惯 点击下箭头,设置 添加新配置 配置 地址为git地址\bin\bash.exe,不要用根目录的git-bash.exe,这个会打开新弹窗后…...
wpf中DataGrid组件每一行的背景色动态变化
背景描述:存在多个轧辊,其中有的轧辊是成对的,成对的辊ROLL_NO这个变量的值相同,有的轧辊是单个暂时没有配对的。成对的辊北京颜色交替突出显示,单个辊不需要设置背景色。 实现: 换辊的时候给成对的辊分配相…...
002-告别乱码-libiconv-C++开源库108杰
本课文包含三个视频! 为什么中文版Windows是编程出现乱码的高发地带?怎么用 libiconv 把国标编码的汉字转换成宇宙统一码?怎么简化 libiconv 那些充满坑的 纯C 函数API? 1. 安装 libiconv 通常,你在 MSYS2 中安装过 G…...
DeepSeek赋能智慧交通:城市交通流量智能预测与优化,开启智能出行新时代
在数字化转型的浪潮中,智慧交通正成为提升城市运行效率、改善居民出行体验的关键领域。 DeepSeek作为人工智能领域的前沿技术,凭借其强大的数据分析、智能决策和多模态交互能力,正在为智慧交通注入新的活力,推动交通管理从“经验…...
Token登录授权、续期和主动终止的方案(Redis+Token(非jwtToken))
1、RedisToken方案的授权 1.1 基本原理 登录后使用UUID生成token,前端每次请求都会带上这个token作为授权凭证。这种方案是能自动续签,也能做到主动终止。所以很多项目用的都是RedisToken方案,简单方便问题少。缺点就是需要依赖Redis和数据…...
强大的数据库DevOps工具:NineData 社区版
本文作者司马辽太杰, gzh:程序猿读历史 在业务快速变化与数据安全日益重要的今天,生产数据库变更管理、版本控制、数据使用是数据库领域的核心挑战之一。传统的解决方式往往采用邮件或即时通讯工具发起审批流程,再通过堡垒机直连数…...
【蓝桥杯速成】| 1.暴力解题
1高频考点与暴力解题_哔哩哔哩_bilibili 感谢up主分享,以下内容是学习笔记,以c为主,部分python 题目一:维纳的年龄 题目内容 美国数学家维纳(N.Wiener)智力早熟, 11岁就上了大学。他曾在1935~1936年应邀来中国清华大…...
【动态规划篇】1137. 第 N 个泰波那契数
前言: 动态规划问题一般分为五步: 先确定一个状态表示根据状态表示来推导状态方程初始化填表顺序返回值 ①状态表示 先创建一个以为数组,起名为dp,这个一维数组就叫做dp表 把dp表填满,填满后的某个值就是我们想要的结果状态表…...
MySQL事务深度解析:ACID特性、隔离级别与MVCC机制
引言 在数据库系统中,事务是保障数据一致性与完整性的核心机制。MySQL通过ACID特性、多级隔离策略和MVCC(多版本并发控制)实现了高性能与高可靠性的平衡。本文将从底层原理出发,系统解析事务的四大特性、隔离级别的实现逻辑&am…...
网络信息安全专业(710207)网络安全攻防实训室建设方案
一、引言 随着信息技术的飞速发展,网络空间安全已成为国家安全的重要组成部分,对网络信息安全专业人才的需求日益增长。为满足网络信息安全专业(专业代码710207)的教学需求,提升学生在网络安全攻防领域的实践能力&…...
【Linux】:线程池
朋友们、伙计们,我们又见面了,本期来给大家带来线程池相关的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结构…...
共享内存(System V)——进程通信
个人主页:敲上瘾-CSDN博客 进程通信: 匿名管道:进程池的制作(linux进程间通信,匿名管道... ...)-CSDN博客命名管道:命名管道——进程间通信-CSDN博客 目录 一、共享内存的原理 二、信道的建立 …...
ctfhub-HTTP协议
请求方式 它要我们使用CTF**B Method,其实就是ctfhub方式 我们直接抓包试一试,把GET改成CTFHUB,在发送到repeater 在repeater处点击发送,得到响应 302跳转 点击“give me flag"没有任何变化,我们抓个包试试 我们把它发送到repeater&…...
【TMS570LC4357】之工程创建
备注:具体资料请在官网海淘.TMS570LC4357资料 在线文档Hercules Safety MCU Resource Guide — Hercules Safety MCUs Documentation XDS100 Debug Probe (ti.com) Git https://git.ti.com/git/hercules_examples/hercules_examples.git https://git.ti.com/cgit/h…...
一种改进的Estimation-of-Distribution差分进化算法
为了充分利用差分进化(DE)的强大开发和estimation-of-distribution算法(EDA)的强大探索,提出了一种混合estimation-of-distribution算法的改进差分进化IDE-EDA。首先,提出了一种新的协同进化框架࿰…...
正则表达式(复习)
文章目录 一、[]: 一个字符集合二、{}: 重复次数三、特殊符号四、(): 分组五、python代码示例六、注意 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个…...
大数据学习(61)-Impala与Hive计算引擎
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
洛谷每日1题-------Day18__P1320 压缩技术(续集版)
题目描述 设某汉字由 NN 的 0 和 1 的点阵图案组成。 我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有几个 0,第二个数表示接下来连续有…...
[数据结构]排序之希尔排序( 缩小增量排序 )
希尔排序法又称缩小增量法。希尔排序法的基本思想是: 先选定一个整数,把待排序文件中所有记录分成个 组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工 作。当…...
LORA中 软提示是什么
LORA中 软提示是什么 软提示的原理概述 软提示(Soft Prompt)是提示学习(Prompt Learning)中的一种技术,主要用于引导预训练语言模型在特定任务上的表现。传统的提示学习通常使用硬提示(Hard Prompt),也就是在输入文本中添加固定的离散文本,比如在情感分析任务里,在…...
问问 DeepSeek 什么是网络爬虫
在现代互联网时代,信息的获取和整理变得至关重要,而爬虫(Web Crawler) 是一种自动化工具,帮助我们从网页上提取数据。爬虫在新闻采集、商品比价、天气数据收集等方面应用广泛。 爬虫的工作原理 爬虫的基本工作流程如下…...
