浅拷贝和深拷贝AI

devtools/2025/3/15 11:05:16/

值传递,在vue3中深拷贝的解决方法

      • 1. 浅拷贝
        • 使用结构赋值
        • 使用 `Object.assign`
      • 2. 深拷贝
        • 使用 `JSON.parse(JSON.stringify())`
        • 使用 Lodash 的 `cloneDeep`
        • 使用递归函数手动实现深拷贝
      • 3. 使用 Vue 3 的响应式系统相关工具
        • 使用 `toRaw`
        • 使用 `markRaw`
      • 4. 使用第三方库
        • 使用 `structuredClone`(现代浏览器支持)
        • 使用 `immer`
      • 总结

在 Vue 3 中,当你希望复制一个对象并确保对新对象的修改不会影响到原对象时,可以使用多种方法来实现这一点。以下是所有常见的解决方法及其适用场景:

1. 浅拷贝

浅拷贝只复制对象的第一层属性,对于嵌套的对象或数组,仍然会引用原始对象中的内容。

使用结构赋值
javascript">const original = { a: 1, b: { c: 2 } };
const shallowCopy = { ...original };
shallowCopy.b.c = 3; // 这会影响到原对象中的 `b` 对象
console.log(original.b.c); // 输出 3
使用 Object.assign
javascript">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())

适用于简单的对象结构,但不支持函数、循环引用等复杂情况。

javascript">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

然后在代码中使用:

javascript">import _ from 'lodash';const original = { a: 1, b: { c: 2 } };
const deepCopy = _.cloneDeep(original);
deepCopy.b.c = 3; // 不会影响到原对象
console.log(original.b.c); // 输出 2
使用递归函数手动实现深拷贝

如果你不想依赖外部库,也可以自己实现一个深拷贝函数。

javascript">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

获取响应式对象的原始对象。

javascript">import { reactive, toRaw } from 'vue';const original = reactive({ a: 1, b: { c: 2 } });
const rawOriginal = toRaw(original);
// 注意:toRaw 只是获取原始对象,并不创建副本
使用 markRaw

标记一个对象永远不应该被转换为响应式对象。

javascript">import { markRaw } from 'vue';const original = { a: 1, b: { c: 2 } };
const markedRaw = markRaw(original);
// 标记后,Vue 将不会尝试将这个对象变为响应式

4. 使用第三方库

除了 Lodash 之外,还有其他一些流行的第三方库可以帮助你进行深拷贝。

使用 structuredClone(现代浏览器支持)

这是 JavaScript 原生提供的一个方法,支持深拷贝,但需要注意浏览器兼容性。

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

然后在代码中使用:

javascript">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 提供了更强大且灵活的解决方案。

通过选择合适的方法,你可以确保在修改新对象时不会影响到原对象的数据。

文章来源:https://blog.csdn.net/weixin_55493330/article/details/146205989
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/devtools/166925.html

相关文章

打造Windows服务器安全堡垒:安当SLA双因素认证方案详解

一、引言&#xff1a;Windows服务器安全亟待升级 在数字化转型的浪潮下&#xff0c;Windows服务器承载着企业核心业务系统、数据库及敏感数据。然而&#xff0c;传统的“用户名密码”单因素认证方式已暴露显著风险&#xff1a; • 弱密码泛滥&#xff1a;据统计&#xff0c;80…

机器人交互系统 部署构建

环境要求 Ubuntu 20.04 或更高版本ROS Noetic 或兼容版本Python 3.8 安装步骤 1. 安装ROS环境&#xff08;如未安装&#xff09; sudo apt update sudo apt install ros-noetic-desktop-full source /opt/ros/noetic/setup.bash2. 创建工作空间并克隆代码 mkdir -p ~/code…

NAT NAPT

NAT NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09; 主要用于在不同网络&#xff08;如私有网络和公共互联网&#xff09;之间进行 IP 地址转换&#xff0c;解决IP 地址短缺问题&#xff0c;并提供一定的安全性。 IPv4 地址是 32 位&#xf…

XMI(XML Metadata Interchange)和XML之间的关系

XMI&#xff08;XML Metadata Interchange&#xff09;和XML之间的关系可以从以下几个方面进行阐述&#xff1a; 一、定义与背景 XML&#xff1a; XML&#xff08;eXtensible Markup Language&#xff09;是一种标记语言&#xff0c;被设计用来传输和存储数据。它是一种自描述…

spring boot3-redis分库及配置

Java的Maven类型&#xff0c;理论不想多说&#xff0c;直接用 1、pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2、博主比较喜欢用applicat…

PythonWeb开发框架—Flask框架之flask-sqlalchemy、序列化和反序列化使用详解

1.安装依赖库 pip install flask-sqlalchemy pip install pymysql 2.连接数据库配置 from flask import Flask from flask_sqlalchemy import SQLAlchemyapp Flask(__name__) #创建 Flask 应用实例#配置数据库连接 app.config[SQLALCHEMY_DATABASE_URI]mysql://root:stud…

【C++设计模式】第十六篇:迭代器模式(Iterator)

注意&#xff1a;复现代码时&#xff0c;确保 VS2022 使用 C17/20 标准以支持现代特性。 遍历聚合对象的统一方式 1. 模式定义与用途 核心思想 ​迭代器模式&#xff1a;提供一种方法顺序访问聚合对象的元素&#xff0c;而无需暴露其内部表示。关键用途&#xff1a; 1.​统一…

网络安全反渗透 网络安全攻防渗透

网络渗透防范主要从两个方面来进行防范&#xff0c;一方面是从思想意识上进行防范&#xff0c;另一方面就是从技术方面来进行防范。 1.从思想意识上防范渗透 网络攻击与网络安全防御是正反两个方面&#xff0c;纵观容易出现网络安全事故或者事件的公司和个人&#xff0c;在这些…