JS深拷贝和浅拷贝的理解

一、为什么基本数据类型保存在栈中,而引用数据类型保存在堆中?
(1)堆比栈大,栈比堆速度快;
(2)基本数据类型比较稳定,而且相对来说占用的内存小。
(3)引用数据类型大小是动态的,而且是无限的,引用值的大小会改变,不能把它放在栈中,否则会降低变量查找的速度,因此放在变量栈空间的值是该对象存储在堆中的地址,地址的大小是固定的,所以它存储在栈中对变量性能无任何负面影响。
(4)堆内存是无序存储,可以根据引用直接获取;
二、从数据结构的角度来讲,对象就是栈的指针和堆中的数值。
三、js不允许直接访问保存在堆内存中的对象,所以在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值;
四、基本数据类型使用typeof可以返回其基本数据类型,但是NULL类型会返回object,因此null值表示一个空对象指针;引用数据类型使用typeof会返回object,此时需要使用instanceof来检测引用数据类型;
五、定义引用数据类型需要使用new操作符,后面再跟一个构造函数来创建;
六、js浅拷贝和深拷贝


js1.jpg
js2.jpg

(1)深拷贝和浅拷贝简单理解:
浅拷贝和深拷贝都只针对于引用数据类型,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存;但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
(2)区别:浅拷贝只复制对象的第一层属性、深拷贝可以对对象的属性进行递归复制。
(3)Object.assign()实现浅拷贝及一层的深拷贝。
(4)手动实现深拷贝与递归实现深拷贝
(5)热门的函数库lodash,也有提供_.cloneDeep用来做深拷贝;
(6)jquery实现深拷贝,jquery提供一个$.extend可以用来做深拷贝。
(7)slice()和concat()都并非深拷贝;

你可能感兴趣的:(JS深拷贝和浅拷贝的理解)