理解深拷贝和浅拷贝之前先了解下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. 【日拱一卒】链表——如何实现lru

    LRU Redis的内存淘汰机制好几种,如ttl.random.lru. lru(less recently used)即最近最少使用策略,表示在最近一段时间内最少被使用到的Redis键,如果遇到内存 ...

  2. JS如何判断表单中用户选择哪个哪个选项?

    JS如何判断表单中用户选择哪个哪个选项? HTML代码: <form name="form1" onsubmit="return foo();"> ...

  3. fork系统调用关于如何让子进程先运行{wait(),waitpid(),sleep()}

    在父进程里面调用wait()和waitpid()可以确保子进程先运行,因为当子进程运行完后会变成僵尸进程,此时会发送一个信号给父进程,父进程接受到信号才会运行. 有人或许会问如果在父进程调用wait之 ...

  4. 云原生haproxy 代理-ebpf

    在如下网络层面下,代理(比如Envoy nginx )执行额外的L7策略(Health checks, service discovery, load balancing, mutual TLS),其 ...

  5. 基于FFmpeg的Dxva2硬解码及Direct3D显示(三)

    初始化Direct3D 目录 初始化Direct3D 创建Direct3D物理设备对象实例 创建Direct3D渲染设备实例 创建Direct3D视频解码服务 Direct3D渲染可以通过Surfac ...

  6. centos6 安装 terminator

    yum install terminator 报错: No package terminator available. 解决: yum install epel-release 报错 Cannot r ...

  7. 一个Wpf的开发框架

    引言 本框架使用Prism做MVVM,优点咱就不说了,主要了容器注入,消息和DI,比自己写省很多事.网上有很多标准的MVVM的使用方法,但是没有形成一个系统级的框架.本框架从登录到具体业务的使用,还有 ...

  8. SpringBoot 之 @ControllerAdvice 拦截异常并统一处理

    在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有@Requ ...

  9. SQL注入学习-Dnslog盲注

    1.基础知识 1.DNS DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 ...

  10. Vegas视频的音频叠加效果怎么实现,可以用其他软件吗

    有时我们会用Vegas为某段影片配音,我们要怎么把配音和背景声融合在一起呢?想必马上会有人反应过来:让配音和背景声分别置于两条轨道上就好了.这当然是一个相当好的方式. 可是,如果我想要把两段音频合成一 ...