理解深拷贝和浅拷贝之前先了解下js中的基本类型和引用类型

1、基本类型:

在js中,数据的基本类型undefined,null,string,number,boolean,在变量中赋的实际值,基本类型就是简单的数据段。

基本类型的值是不可以改变的

var a = 1;

var b = a;

a++;

console.log(a); //2

console.log(b); //1

这里a和b是独立的,当改变a或b,其另外一个值不会随之改变

2、引用类型:

在js中,数据的引用类型object,Array,RegExp,date,function,在变量中赋的实际值

引用类型的值是可以改变的

var arr = [1,2,3,4,5];

var arr2 = arr;

arr[0] = 2;

console.log(arr); //[2、2、3、4、5]

console.log(arr2);//[2、2、3、4、5]

这里在改变arr[0]中的值后,arr2数据也跟着改变,引用类型在赋值的时候(arr2=arr),其实在栈内存中添加了arr2,但是堆内存中还是[1,2,3,4,5],通俗点讲就是引用类型赋值并非真正意义上的数据赋值,而是在栈内存中添加一个指针,还是指向堆内存中的[1,2,3,4,5],只添加栈内存的指针

好,到这里我们在讨论深拷贝和浅拷贝,深拷贝顾名思义是在数据是相互独立的,改数据而另一个不受影响,浅拷贝则是数据会随之改变而改变。

这么一看,基本类型不正好是嘛,数据都是相互独立的,乍看好像还真是的。

但是,但是,我们所说的深拷贝必须要在复杂的object类型下,基本类型里没有object,那么只能是引用类型。

再来看个例子:

var arr3 = [[1,2],3,4,5];

var arr4 = arr3;

arr3[0][1] = 3;

console.log(arr3); //[[1,3],3,4,5]

console.log(arr4); //[[1,3],3,4,5]

明明改了arr3,为何arr4也改了,这不是我想要的,那如何独立呢,你会发现使用什么for循环,slice,concat是根本不管用的,网上有其他的坑,在此我就不多说了,直接说解决办法

方法1、JSON

利用JSON.stringify和JSON.parse

var arr3 = [[1,2],3,4,5];

var arr4 = JSON.parse(JSON.stringify(arr3));

arr3[0][1] = 3;

console.log(arr3); //[[1,3],3,4,5]

console.log(arr4); //[[1,2],3,4,5]

但是这种方法有个小弊端,就是值不能为undefined或null,最好对数据提前判断

方法2、jq $.extend

$.extend([deep],target,object1[,objextN]);    //deep 值为true或false,true为深拷贝,false为浅拷贝。target 目标对象,其他对象的成员属性将被附加到该对象上 object1/objextN 是需要被操作的对象,可以是多个,这里是例子中的arr3

var arr3 = [[1,2],3,4,5];

var arr4 = $.extend(true,[],arr3);

arr3[0][1] = 3;

console.log(arr3); //[[1,3],3,4,5]

console.log(arr4); //[[1,2],3,4,5]

以上就是介绍的两种方法

理解js浅拷贝和深拷贝的更多相关文章

  1. 关于js浅拷贝与深拷贝的理解

    前端开发中,一般情况下,很少会去在意深拷贝与浅拷贝的关系. 大家知道,js变量有2种数据类型:基本类型和引用类型.基本类型的拷贝是将整个值完全拷贝一份的,也就是深拷贝.就是开辟了新的堆内存.所以基本类 ...

  2. JS - 浅拷贝与深拷贝的理解以及简单实现方法

    前几天撸项目代码时, 由一个技术点间接牵扯出了这东西. 所以就来总结一下. 深拷贝 拷贝对象每个层级的属性. 作用的对象是 js中引用类型的对象,基本类型没有涉及. 本质上将引用类型的对象在堆上重新开 ...

  3. 一篇文章理解JS数据类型、深拷贝和浅拷贝

    前言 笔者最近整理了一些前端技术文章,如果有兴趣可以参考这里:muwoo blogs.接下来我们进入正片: js 数据类型 六种 基本数据类型: Boolean. 布尔值,true 和 false. ...

  4. 关于JS浅拷贝和深拷贝

    在 JS 中有一些基本类型像是Number.String.Boolean,而对象就是像这样的东西{ name: 'Larry', skill: 'Node.js' },对象跟基本类型最大的不同就在于他 ...

  5. js 浅拷贝和深拷贝

    传值与传址 了解了基本数据类型与引用类型的区别之后,我们就应该能明白传值与传址的区别了.在我们进行赋值操作的时候,基本数据类型的赋值(=)是在内存中新开辟一段栈内存,然后再把再将值赋值到新的栈中.例如 ...

  6. 我的Python学习笔记(二):浅拷贝和深拷贝

    在Python中,对象赋值,拷贝(浅拷贝和深拷贝)之间是有差异的,我们通过下列代码来介绍其区别 一.对象赋值 对象赋值不会复制对象,它只会复制一个对象引用,不会开辟新的内存空间 如下例所示,将test ...

  7. JS 对象的深拷贝和浅拷贝

    转载于原文:https://www.cnblogs.com/dabingqi/p/8502932.html 这篇文章是转载于上面的链接地址,觉得写的非常好,所以收藏了,感谢原创作者的分享. 浅拷贝和深 ...

  8. Javascript/js 的浅拷贝与深拷贝(复制)学习随笔

    js变量的数据类型值分基本类型值和引用类型值. 在ES6(ECMAScript6)以前,基本数据类型包括String.Number.Boolean.Undefined.Null. 基本类型值的复制(拷 ...

  9. js中浅拷贝和深拷贝以及深拷贝的实现

    前言:2019年的第一篇分享... 一.什么是基本类型值和引用类型值?ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型.基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构 ...

随机推荐

  1. zabbix 告警实践分享 一键实现zabbix 电话、邮件、微信告警

    众所周知Zabbix 是一款用来监控IT基础设施的监控套件,同时也具有很多方便运维人员使用的优秀功能,如:支持多条件告警,支持多种告警方式,支持多组模板.支持模板继承,因此在众多的开源运维监控软件中独 ...

  2. ixgbe 驱动 为xxx驱动做准备1

    网卡都是pci设备,因此这里每个网卡驱动其实就是一个pci驱动.并且intel这里是把好几个万兆网卡(82599/82598/x540)的驱动做在一起的.V4L2 一样几个类型摄像头合并在一起 先说一 ...

  3. TCP/IP协议图解

    联网的各个终端之间能否进行交互的软件基础是网络协议栈,目前主流的网络协议栈是TCP/IP协议栈. 1.主机到网络层协议:以太网协议 主机到网络层主要为IP协议和ARP协议提供服务.发送和接收网络数据报 ...

  4. ceph单机多mon的实现

    ceph默认情况下是以主机名来作为mon的识别的,所以这个情况下用部署工具是无法创建多个mon的,这个地方使用手动的方式可以很方便的创建多个mon 1.创建mon的数据存储目录 mkdir /var/ ...

  5. 太湖杯writeup

    CheckInGame checkInGame本题是个js游戏 设置个断点后,之后修改时间即可,然后把游戏玩完就行. ezWeb 本题是模板注入,过滤了{}和"",用︷︸和无引号的 ...

  6. 想要看懂鸿蒙OS源码?朱老师带你从框架分析开始

    HarmonyOS V2.0是面向轻量级设备的鸿蒙L0/L1级设备端操作系统,于2020.9开源至今已有2个多月,但是很多同学在学习鸿蒙源码时仍然感觉难以下手,找不到突破口. 2020.11.25(本 ...

  7. idea中运行tomcat不能访问8080主页问题

    问题 初次使用IntelliJ IDEA,但今天在运行项目启动Tomcat后,发现无法访问Tomcat首页,出现404错误:输入http://localhost:8080时无法访问Tomcat首页,但 ...

  8. Python:利用Entrez库筛选下载PubMed文献摘要

    一个不是学生物的孩子来搞生物,当真是变成了一块废铁啊,但也是让我体会到了一把生物信息的力量. 废话不多说,开整! 任务:快速高效从PubMed上下载满足条件的文献PMID.标题(TI).摘要(AB). ...

  9. 万字长文!从底层开始带你了解并发编程,彻底帮你搞懂java锁!

    线程是否要锁住同步资源 锁住 悲观锁 不锁住 乐观锁 锁住同步资源失败 线程是否要阻塞 阻塞 不阻塞自旋锁,适应性自旋锁 多个线程竞争同步资源的流程细节有没有区别 不锁住资源,多个线程只有一个能修改资 ...

  10. Django解决(1146, "Table 'd42.django_session' doesn't exist")方法

    执行 ./manage.py makemigrations sessions ./manage.py migrate sessions