js中的深复制与浅复制

前言

所谓深复制与浅复制(深拷贝与浅拷贝),乍一听感觉听高大上,像是一个非常难理解的概念,其实我们平常项目开发都是在用的,只是你可能不知道该怎么叫它的名字而已,就像你听熟了一首歌,就是不知道这首歌叫什么名字一样。

在javascript中有两种数据类型,一种是基本类型,另一种是引用类型,今天说讨论的深复制与浅复制就是和这两种数据类型有直接的关系。

1、基本类型的复制

js种的基本类型有Number Boolean  String  undefined null这五类,在声明的时候,基本类型的数据都是存放在栈内存中,如下图:

首先声明的a变量会存储在栈内存里,然后又在栈内存里复制了一个a并且赋值给b,此时a和b的值都是abc,然后给b重新赋值,由于a和b都是独立存在的两个变量,所以两个值任何一个变化,都不会影响另外一个变量的值;通俗点来说,就是你有一个叫做a的word文档,原本在D盘里,你把它复制了一份仍在了桌面上,这个时候你对两个文件的编辑并不会相互影响,如上图。

 2、引用类型的复制

引用类型,即object,function的值都是存在堆内存中,栈内存中通过指针指向这个值在堆中的地址,而对于引用类型来说普通的赋值操作只是将指针的地址复制了一份给新的变量,属于浅复制,如下图:

这里将arr赋值给arr1,其实就是复制了arr的指针,所以arr1的指向地址和arr是一样的,这样不管操作arr还是arr1都会改变堆中数组的值,打印arr或者arr1都是改变后的值,此为浅复制。对于函数,也是就如此

那么如何实现即能复制arr的值,又能使它在堆中的值也复制一份呢?

猜你喜欢

转载自www.cnblogs.com/gaosong-shuhong/p/9285058.html