VUE浅拷贝和深拷贝

article/2025/10/5 14:16:37

文章目录

  • 前言
  • 一、数据类型
    • 1.1.基本数据类型
    • 1.2.引用数据类型
    • 1.3.区别
  • 二、浅拷贝
    • 2.1.定义
    • 2.2.浅拷贝特点
  • 三、深拷贝
    • 3.1.定义
    • 3.2.深拷贝特点
  • 四、拷贝实现方案
    • 4.1.Object.assign()
    • 4.2.concat()
    • 4.3.slice()
    • 4.4.JSON.parse(JSON.stringify())
    • 4.5.cloneDeep()
  • 五、结论


前言

在理解浅拷贝和深拷贝浅前,必须先理解基本数据类型和引用数据类型的区别。

一、数据类型

1.1.基本数据类型

字符串(Sring)、布尔值(Boolean)和数字(Number)

1.2.引用数据类型

数组(Array)和对象(Object)

1.3.区别

  基本数据类型是存储在栈内存中。而引用类型存放的值是指向数据的引用,而不是数据本身,真实数据是存放在堆内存里,具体见如下:

在这里插入图片描述

二、浅拷贝

2.1.定义

  浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。

2.2.浅拷贝特点

  对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础类型的拷贝,其中一个对象修改该值,不会影响另外一个。

var a = 10
var b = a
b = 20
console.log("a",a) //10
console.log("b",b) //20

在这里插入图片描述
  对于引用类型,比如数组或者类对象,因为引用类型是引用传递,所以浅拷贝只是把内存地址赋值给了成员变量,它们指向了同一内存空间。改变其中一个,会对另外一个也产生影响

var obj = {a:"AAA"
}
var obj2 = obj
obj2.a = "BBB"
console.log("obj",obj) //{name: "BBB"}
console.log("obj2",obj2) //{name: "BBB"}

在这里插入图片描述

三、深拷贝

3.1.定义

  深拷贝,在拷贝引用类型成员变量时,为引用类型的数据成员另辟了一个独立的内存空间,实现真正内容上的拷贝。

3.2.深拷贝特点

  对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础类型的拷贝,其中一个对象修改该值,不会影响另外一个(和浅拷贝一样)。
  对于引用类型,比如数组或者类对象,深拷贝会新建一个对象空间,然后拷贝里面的内容,所以它们指向了不同的内存空间。改变其中一个,不会对另外一个也产生影响。

var obj = {a:"AAA"
}
var obj2 = {} // 创建新的对象
obj2 = obj
obj2.a = "BBB"
console.log("obj",obj) //{name: "AAA"}
console.log("obj2",obj2) //{name: "BBB"}

在这里插入图片描述

四、拷贝实现方案

4.1.Object.assign()

  单级结构时深拷贝,多级结构浅拷贝,Object.assign()对象是用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,将返回目标对象。
a)单级结构(一级拷贝是深拷贝):

var obj = {a: 10,
}
var obj2 = Object.assign({}, obj);
obj2.a = 20
console.log("obj",obj); //{a: 10}
console.log("obj2",obj2) //{a: 20}

b)多级结构(一级拷贝是浅拷贝,修改二级对象还是会影响原对象):

var obj = {a: 10,b: {c:"AAA",d:666}
}
var obj2 = Object.assign({}, obj);
obj2.b.c = "BBB"
console.log("obj",obj); //{a: 10,b: {c:"BBB",d:666}}
console.log("obj2",obj2); //{a: 10,b: {c:"BBB",d:666}}

4.2.concat()

单级结构时深拷贝,多级结构浅拷贝
a)单级结构(一级拷贝是深拷贝):

let arr = [1, 2];
let arr2 = arr.concat();
arr2[1] = 3;
console.log("arr",arr) //[1, 2]
console.log("arr2",arr2) //[1, 3]

b)多级结构(一级拷贝是浅拷贝):

let arr = [1, 2, {a: 'AAA'
}];
let arr2 = arr.concat();
arr2[2].a = 'BBB';
console.log("arr",arr) //[1, 2, {a: 'BBB'}]
console.log("arr2",arr2) //[1, 2, {a: 'BBB'}]

4.3.slice()

单级结构时深拷贝,多级结构浅拷贝
a)单级结构(一级拷贝是深拷贝):

let arr = [1, 2, 3];
let arr2 = arr.slice();
arr2[1] = 4;
console.log("arr",arr) //[1, 2, 3]
console.log("arr2",arr2) //[1, 4, 3]

b)多级结构(一级拷贝是浅拷贝):

let arr = [1, 2, {a:'AAA'}];
let arr2 = arr.slice();
arr2[2].a = 'BBB';
console.log("arr",arr) //[1, 2, {a: 'BBB'}]
console.log("arr2",arr2) //[1, 2, {a: 'BBB'}]

4.4.JSON.parse(JSON.stringify())

  用JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。
  单级多级均为深拷贝,但需要注意无法拷贝RegExp对象、function和symbol

let arr = [1, 2, {a:'AAA'}];
let arr2 = JSON.parse(JSON.stringify(arr))
arr2[2].a = 'BBB';
console.log("arr",arr) //[1, 2, {a: 'AAA'}]
console.log("arr2",arr2) //[1, 2, {a: 'BBB'}]

4.5.cloneDeep()

单级多级均为深拷贝,使用lodash工具中cloneDeep方法实现深拷贝,需要通过npm引入lodash库
npm i -save lodash //全局安装

<script>import _ from 'lodash';export default {name: 'Test',mounted() {const arr = [1, 2, { a: 'AAA' }];const arr2 = _.cloneDeep(arr);arr2[2].a = 'BBB';console.log('arr', arr); // [1, 2, {a: 'AAA'}]console.log('arr2', arr2); // [1, 2, {a: 'BBB'}]},};
</script>

五、结论

类型第一级为基础数据类型原数据中包含子对象
浅拷贝改变不会使原始数据改变改变会使原始数据改变
深拷贝改变不会使原始数据改变改变不会使原始数据改变

如有疑问或不足之处,欢迎交流指正,谢谢!!!


http://chatgpt.dhexx.cn/article/1MGJoNU2.shtml

相关文章

C# 中的浅拷贝和深拷贝

在本文中&#xff0c;将通过示例讨论C&#xff03;中的浅拷贝和深拷贝。这是上一篇文章的续篇。因此&#xff0c;在继续本文之前&#xff0c;请阅读以前的文章&#xff0c;其中之前使用示例讨论了C&#xff03;中的原型设计模式。 什么是深拷贝和浅拷贝&#xff1f; 浅复制和…

JAVA 浅拷贝和深拷贝

拷贝 拷贝即对已有的数据创建一个副本&#xff0c;在 Java 中&#xff0c;拷贝可分为引用拷贝、浅拷贝、深拷贝。 引用拷贝 在 Java 中&#xff0c;实例化后的对象存储在堆区&#xff0c;而局部变量存放在局部变量表(栈)中&#xff0c;如&#xff1a; public void yinYongC…

js浅拷贝和深拷贝

1、JS数据类型 基本数据类型&#xff1a;Boolean、String、Number、null、undefined 引用数据类型&#xff1a;Object、Array、Function、RegExp、Date等 2、深拷贝与浅拷贝 深拷贝和浅拷贝都只针对引用数据类型&#xff0c; 浅拷贝会对对象逐个成员依次拷贝&#xff0c;但…

C++浅拷贝和深拷贝

1、浅拷贝 浅拷贝&#xff1a;又称值拷贝&#xff0c;将源对象的值拷贝到目标对象中去&#xff0c;本质上来说源对象和目标对象共用一份实体&#xff0c;只是所引用的变量名不同&#xff0c;地址其实还是相同的。 举个简单的例子&#xff0c;你的小名叫西西&#xff0c;大名叫…

彻底理解Python中浅拷贝和深拷贝的区别

目录 前言 1. 浅拷贝和深拷贝的概念 2. is和的区别 3. 赋值操作 4. copy模块里面的copy()方法 5. copy模块里面的deepcopy()方法 6.字典自带的copy方法 7.切片表达式拷贝 8.总结 前言 Python 的所有变量其实都是指向内存中的对象的一个指针&#xff0c;这确实和之前学…

如何理解java的回调函数?

对于技术问题&#xff0c;会用是一回事&#xff0c;理解这个技术问题的来龙去脉、设计者当初为什么要设计这个功能、这个技术问题有哪些优势、适用哪些场景又是另外回事了。 前者照猫画虎得其形&#xff0c;后者形神兼备得其意&#xff0c;这也是所谓青铜与王者的区别。 会使…

java使用回调函数

java回调函数 回调函数&#xff08;callback Function&#xff09;&#xff0c;顾名思义就是用来回调的函数。在两个类A、B中&#xff0c;A在调用B接口的同时B也在调用A 回调函数也常用于线程中的异步获取消息。 举个简单的例子&#xff0c;公司中老板分发任务给员工A&#…

java中回调函数的实现

在java的事务中&#xff0c;有时候可能会遇到以下情况&#xff0c;第一步是更新某某表&#xff0c;中间可能要更新不确定的多步&#xff0c;最后一步是更新缓存&#xff0c;结构大致如下&#xff1a; &#xff08;1&#xff09;updateA(); &#xff08;2&#xff09;updateXX…

什么是java回调函数

回调函数 一&#xff1a;故事背景二&#xff1a;概念三&#xff1a;回调函数的作用四&#xff1a;java中如何进行回调4.1 类图4.2 定义回调接口4.3 实现回调接口4.4 调用方法使用回调函数4.5 Main函数调用4.6 总结描述 五&#xff1a;回调函数的优点5.1 灵活性5.2 解耦性5.3 异…

简单举例JAVA回调函数的实现

来自维基百科的对回调&#xff08;Callback&#xff09;的解释&#xff1a;In computer programming, a callback is any executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at a given time. This execut…

java回调函数机制

Java回调函数机制 参考了网上的一些资料&#xff0c;下面也做出一些总结&#xff0c;供初学者了解学习。 一、 概述 软件模块之间总是存在着一定的接口&#xff0c;从调用方式上&#xff0c;可以把他们分为三类&#xff1a;同步调用、回调、异步调用 。 同步调用&#xff1a;一…

java中如何实现回调函数

最近工作需要研究了一会别人写的库&#xff0c;其中充满着各种"回调函数"&#xff0c;因此把自己理解给记录下来&#xff0c;存档。 首先我们来看看回调函数 这个概念的具体由来&#xff0c;百度百科的示义如下&#xff1a; 回调函数就是一个通过函数指针调用的函数。…

Java回调函数 + 使用案例

文章目录 前言什么是回调函数第0个版本第1个版本第2个版本第3个版本第4个版本第5个版本第6个版本回头解析前言描述的问题1. MethodIntrospector.selectMethods()2. 抽象类MethodIntrospector3. 方法selectMethods()4. 成员变量USER_DECLARED_METHODS5. 方法doWithMethods()6. d…

Java-回调函数

什么是回调 函数调用可以分为三种模式&#xff0c;串行调用、异步调用、回调。这三种都是日常开发中常见到的方式。 一个方法执行完&#xff0c;再执行下一个&#xff0c;串行逻辑会阻塞线程执行流程&#xff0c;等到所有逻辑执行结束&#xff0c;线程才会结束。 异步执行是…

java回调函数(callBack)

最近有个新同事给我写了个接口&#xff0c;说是用到了回调&#xff0c;我等了半天发现结果才返回回来&#xff0c;把我都整急了。最后我看了他的代码&#xff0c;目瞪口呆。他还信誓旦旦的说没错&#xff0c;按网上的例子来写的。 我一搜&#xff0c;网上例子真一大堆&#xff…

java回调函数的作用以及运用

模块之间总是存在这一定的接口&#xff0c;从调用方式上看&#xff0c;可以分为三类&#xff1a;同步调用、回调和异步调用。同步调用是一种阻塞式调用&#xff0c;也是我们在写程序中经常使用的&#xff1b;回调是一种双向的调用模式&#xff0c;也就是说&#xff0c;被调用的…

Java回调函数理解和应用

#Java回调函数理解和应用 所谓回调&#xff1a;就是A类中调用B类中的某个方法C&#xff0c;然后B类中反过来调用A类中的方法D&#xff0c;D这个方法就叫回调方法&#xff0c;这样子说你是不是有点晕晕的。 在未理解之前&#xff0c;我也是一脸懵逼&#xff0c;等我理解之后&…

java回调函数(全干货)

产生接口回调的场景 产生接口回调的场景很简单,比如A叫B帮忙做一件事,交代完后A去忙别的事&#xff0c;然后B做完这件事之后会通知A, 通知A的这个动作就是接口回调的动作。接口回调 接口回调的意义是通过接口来实现解耦的的前提下调用另一个类的方法&#xff0c;也就是B为A准…

深入理解Java回调函数

废话不多说&#xff0c;像许多网上介绍回调机制的文章一样&#xff0c;我这里也以一个现实的例子开头&#xff1a;假设你公司的总经理出差前需要你帮他办件事情&#xff0c;这件事情你需要花些时间去做&#xff0c;这时候总经理肯定不能守着你做完再出差吧&#xff0c;于是就他…

java 回调函数解读

模块间调用 在一个应用系统中&#xff0c;无论使用何种语言开发&#xff0c;必然存在模块之间的调用&#xff0c;调用的方式分为几种&#xff1a; &#xff08;1&#xff09;同步调用 同步调用是最基本并且最简单的一种调用方式&#xff0c;类A的方法a()调用类B的方法b()&…