浅谈一下js的浅拷贝和深拷贝

article/2025/10/5 13:30:08

目录

一、什么是拷贝

二、浅拷贝和深拷贝概念

2.1 浅拷贝

代码

2.2深拷贝

代码

2.3 jQuery中的拷贝

三、深拷贝应用场景


一、什么是拷贝

谈到拷贝的话,大家应该是不陌生的,拷贝简单来说就是复制。

复制的话,这里就得想到js的两种数据类型:

1.基本数据类型:Number、String、null、undefined、Boolean。

2.引用数据类型:Object,Array

 对于基本数据类型的话,复制的是值,只有一层,叫浅拷贝,而对于引用数据类型,浅拷贝只能拷贝一层,更深层的只能拷贝地址,这就会造成修改拷贝后的值的时候,原来的数据可能也会变化,这就会破坏原数据。这就需要对数据进行深拷贝。

二、浅拷贝和深拷贝概念

浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用

深拷贝拷贝多层, 每一级别数据都会拷贝

2.1 浅拷贝

代码

<script>//浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用var obj = {id: 1,name: 'andy',msg: {age: 18}};var o = {};//1.直接赋值拷贝// o=obj;  //2.利用for...in 拷贝// for(var k in obj){    //     // k 是属性名 obj[k] 是属性值//     o[k]=obj[k];// }//3.利用es6的扩展运算符将对象展开进行拷贝// o={...obj}//浅拷贝方法Object.assign(o, obj)console.log(o);
<script>

这些方法都是浅拷贝的方法。

这里我们修改o对象的属性然后输出这o对象和obj对象

可以看出,修改了o对象的name属性,obj对象的name属性没有变化,但是修改o对象中的msg对象的age属性后,obj对象中的age属性也变了,这就是因为浅拷贝只拷贝一层,对更深层的对象或数组只能拷贝地址。

2.2深拷贝

  深拷贝拷贝多层,每一级数据都被拷贝。

可以利用函数的递归来实现,对每一层进行拷贝,一直到最后一层,那就是深拷贝了。

代码

<script>var obj1 = {id: 1,name: 'andy',msg: {age: 18},color: ['pink', 'red']};var o1 = {};//封装函数function deepCopy(newObj, oldObj) {for (var k in oldObj) {//判断属性值属于那种数据类型//1.获取属性值 oldObj[k]var item = oldObj[k];//2.判断这个值是否是数组if (item instanceof Array) {newObj[k] = [];deepCopy(newObj[k], item)} else if (item instanceof Object) {//3.判断是否是对象newObj[k]={};deepCopy(newObj[k],item)}else{//4.属于简单数据类型newObj[k]=item;}  }}deepCopy(o1, obj1)o1.msg.age=15;console.log(obj1);console.log(o1);</script>

对于对象的拷贝,通过函数的递归来实现,首先判断对象的属性属于那种数据类型,

1.判断是否是数组,是的话就赋值一个空数组,然后在递归调用该方法,传入这个空数组和属性,

2.判断是否是对象,是的话就赋值一个空对象,然后在递归调用该方法,传入这个空对象和属性,

3.当属性不是数组也不是对象的时候,就是基本数据类型了,直接赋值就行了。

像这样反复递归,最后都变为简单数据类型拷贝,就完成了对象的深拷贝。

从上面代码可以看出,修改o1.msg.age的值为15之后,obj1中的值没有变化,还是为18。

这就完成了对obj1 的深拷贝,也就是说,o1 对象完全复制了obj1 对象,变成一个独立的新对象,并不是多层只复制了地址。

2.3 jQuery中的拷贝

 在jQuery中也提供了一个方法可以进行对象的拷贝:$.extend 和 $.fn.extend 方法。

        var obj1 = {}var obj2 = {name: '1234',yh: true,ab: {a: 1}}//将后续参数克隆给参数1$.extend(obj1, obj2,{oo:123})obj1.ab.a = '我被改了'console.log('obj1', obj1);console.log('obj2', obj2);

 

可以看出,是将后面的参数都克隆到参数1上了,但是对obj1中的ab对象的a属性进行修改后,obj2的属性也被修改了,所以这是浅拷贝。

不过在这个方法的第一个参数填上 true之后就能变为深拷贝

        //不加true ,浅拷贝,加上true 深拷贝var obj1 = {}var obj2 = {name: '1234',yh: true,ab: {a: 1}}//将后续参数克隆给参数2$.extend(true,obj1, obj2,{oo:123})obj1.ab.a = '我被改了'console.log('obj1', obj1);console.log('obj2', obj2);

现在修改obj1中的属性,不会影响到obj2的属性了,变为对obj2的深拷贝了。

三、深拷贝应用场景

在前台发请求从后台获取数据的时候,获取的一般都是json格式的对象,我们一般要对这些数据进行操作,但是这些数据可能有其他地方也需要使用,就可能会造成很多隐性问题,对数据做一次深拷贝,就能让我们更安全的操作数据了,就不会出现原数据的破坏。


http://chatgpt.dhexx.cn/article/kQb7wFfr.shtml

相关文章

前端面试:浅拷贝和深拷贝的区别?

前些天发现了一个巨牛的人工智能学习博客&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转 那么大家晚上好&#xff0c;我是今天晚上的主讲老师&#xff0c;我是兔哥。 我们在面试中经常会被问到浅拷贝和深拷贝的区别&#xff0c;正好群里…

Java 中的浅拷贝和深拷贝

无论是浅拷贝还是深拷贝&#xff0c;都可以通过 Object 类的 clone() 方法来完成&#xff1a; /*** 拷贝** author qiaohaojie* date 2023/3/5 15:58*/ public class CloneTest {public static void main(String[] args) throws Exception {Person person1 new Person(23, &…

Java浅拷贝和深拷贝的方式

文章目录 1. 前言2. 概念介绍2.1 拷贝 / 克隆的概念2.2 为什么需要拷贝方法&#xff1f;2.3 什么是浅拷贝&#xff1f;浅拷贝和深拷贝的区别是什么&#xff1f; 3. 深拷贝的实现方式3.1 手动深拷贝3.2 序列化方式3.2.1 自定义序列化工具函数3.2.2 commons-lang3 的序列化工具类…

JS 浅拷贝和深拷贝详解(巨详细)

目录 一、前置知识详解 1.1.JavaScript数据类型 1.2.理解传值和传址 二、浅拷贝 2.1.浅拷贝的定义和原理 2.2.实现浅拷贝的方法 2.2.1.手写递归实现 2.2.2.利用展开语法实现浅拷贝 2.2.3.Object.assign进行对象的合并 2.2.4.利用Array.prototype.,slice() 2.2.5.利用…

SV中的浅拷贝和深拷贝

1.浅拷贝 浅拷贝&#xff1a; 只拷贝对象中的数据变量&#xff0c;而对于对象中的数据操作(一般为任务和函数)和其中定义的其他类的句柄&#xff0c;采用类似“引用”的方式&#xff0c;浅拷贝前后共用同一内存空间。 可以使用new操作符进行复制。如果一个类包含指向另一个类的…

什么是浅拷贝和深拷贝?

文章目录 1、什么是浅拷贝&#xff1f;2、什么是深拷贝&#xff1f;2.1、常见的深拷贝方式 在Java语言中&#xff0c;当我们需要拷贝一个Java对象的时候&#xff0c;常见的会有两种方式的拷贝:浅拷贝与深拷贝。 浅拷贝&#xff1a;只是拷贝了源对象的地址&#xff0c;所以源对象…

基于java实现浅拷贝和深拷贝

目录 1、概念2、浅拷贝2.1、浅拷贝实战 3、深拷贝3.1、嵌套 clone 方法3.2、使用序列化流3.3、使用开源工具类 1、概念 浅拷贝&#xff1a;在拷贝一个对象时&#xff0c;复制基本数据类型的成员变量&#xff0c;但对引用数据类型的成员变量只进行引用的传递&#xff08;复制其…

js实现浅拷贝和深拷贝

一.数据类型 数据分为基本数据类型和引用数据类型 基本数据类型(String, Number, Boolean, Null, Undefined&#xff0c;Symbol) 引用数据类型&#xff08;Object[Array属于Object]&#xff09; 基本数据类型的特点&#xff1a;直接存储在栈(stack)中的数据 引用数据类型的特点…

浅拷贝和深拷贝

最近学习string类的时候感觉这里概念有点混淆&#xff0c;浅拷贝与深拷贝的区别&#xff0c;上网查了一下&#xff0c;原来没我想 的难么复杂&#xff0c;以下是我的理解&#xff0c;如果有不对的地方求大佬留言交流交流。 浅拷贝&#xff1a; 顾名思义就是浅层的拷贝&#xff…

理解浅拷贝和深拷贝以及实现方法

一、数据类型 数据分为基本数据类型(String, Number, Boolean, Null, Undefined&#xff0c;Symbol)和引用数据类型Object&#xff0c;包含&#xff08;function&#xff0c;Array&#xff0c;Date&#xff09;。 1、基本数据类型的特点&#xff1a;直接存储在栈内存中的数据 …

VUE浅拷贝和深拷贝

文章目录 前言一、数据类型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() 五、结论 前言 在理…

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 异…