美文网首页
JS深拷贝和浅拷贝的理解

JS深拷贝和浅拷贝的理解

作者: AmilyHao | 来源:发表于2020-04-17 19:32 被阅读0次

    一、为什么基本数据类型保存在栈中,而引用数据类型保存在堆中?
    (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深拷贝和浅拷贝的理解

          本文链接:https://www.haomeiwen.com/subject/qzyyvhtx.html