栈、堆、深浅拷贝深入理解(下)

115 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

两者都属于数据结构。

2.堆

堆,一般由操作人员分配释放,会不分配释放,将由OS回收释放。

分配方式类似链表。

堆存储在二级缓存中。

 

1.1 堆内存

在JS中的引用类型(Function、Object、Array、Date、RegExp、Math),这些类型都存储在堆内存中,大小不定,复杂可变的。

这些类型数据的指针 存储在栈内存空间,指针实际指向的是 值存储在堆内存空间。

 

1.2 为什么有栈内存、堆内存之分

通常与垃圾回收机制有关。为了使程序运行时占用的内存最小。

 

3.深、浅拷贝

1.1 浅拷贝

image.png  

浅拷贝只复制某个对象的指针,而不是复制对象本身,新旧对象还是共享一块内存。

 

创建一个新对象,这个对象有着原始对象属性值的一份精准拷贝。

如果属性是基本类型: 拷贝的就是基本类型的值;

如果属性是引用类型: 拷贝的就是内存地址,则如果其中一个对象改变了这个地址,就会影响到另一个对象。

 

1.2 深拷贝

image.png 将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。

深拷贝是的新旧对象是不共享内存的。

 

 

1.3 浅拷贝的方法

1、Object.assign( ):

Object.assign( ) 可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。

image.png  

2、展开运算符 ...:

... 展开运算符是es6 的特性,提供了一种非常方便的方式执行浅拷贝。

image.png  

3、Array.prototype.concat( ):

image.png

 

4、Array.prototype.slice( ):

image.png

 

1.4 深拷贝的方法

 

1、JSON.parse(JSON.stringify( )):

JSON.parse(JSON.stringify( ))。

利用JSON.stringify( )将对象装换成JSON字符串,再用JSON.parse( ) 将字符串转换成对象,一去一来,新的对象产生了。

这种方式不能拷贝函数和正则,因为JSON.stringify( )和JSON.parse( ) 处理后,正则变成空对象,函数变成null了。

 

2、手写深拷贝:

image.png