本文已参与「新人创作礼」活动,一起开启掘金创作之路。
两者都属于数据结构。
2.堆
堆,一般由操作人员分配释放,会不分配释放,将由OS回收释放。
分配方式类似链表。
堆存储在二级缓存中。
1.1 堆内存
在JS中的引用类型(Function、Object、Array、Date、RegExp、Math),这些类型都存储在堆内存中,大小不定,复杂可变的。
这些类型数据的指针 存储在栈内存空间,指针实际指向的是 值存储在堆内存空间。
1.2 为什么有栈内存、堆内存之分
通常与垃圾回收机制有关。为了使程序运行时占用的内存最小。
3.深、浅拷贝
1.1 浅拷贝
浅拷贝只复制某个对象的指针,而不是复制对象本身,新旧对象还是共享一块内存。
创建一个新对象,这个对象有着原始对象属性值的一份精准拷贝。
如果属性是基本类型: 拷贝的就是基本类型的值;
如果属性是引用类型: 拷贝的就是内存地址,则如果其中一个对象改变了这个地址,就会影响到另一个对象。
1.2 深拷贝
将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。
深拷贝是的新旧对象是不共享内存的。
1.3 浅拷贝的方法
1、Object.assign( ):
Object.assign( ) 可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。
2、展开运算符 ...:
... 展开运算符是es6 的特性,提供了一种非常方便的方式执行浅拷贝。
3、Array.prototype.concat( ):
4、Array.prototype.slice( ):
1.4 深拷贝的方法
1、JSON.parse(JSON.stringify( )):
JSON.parse(JSON.stringify( ))。
利用JSON.stringify( )将对象装换成JSON字符串,再用JSON.parse( ) 将字符串转换成对象,一去一来,新的对象产生了。
这种方式不能拷贝函数和正则,因为JSON.stringify( )和JSON.parse( ) 处理后,正则变成空对象,函数变成null了。
2、手写深拷贝: