js 深拷贝+浅拷贝

  • JS数据类型

  1.基本类型(栈数据)

    String、Number、Boolean、undefined、null

    2.引用类型(堆数据)

    Object(常用的包括Function、Array、Date、RegExp等)

  PS:堆和栈的区别

  值类型是存在栈里的,存取速度都很快。

  栈的特点:先进后出,类似羽毛球桶,先放进去的羽毛球,要想拿出来,必须先把后放进去的羽毛球拿出来。

  引用类型的真实数据存在堆里。

  堆的特点:堆就像一个仓库,随机存,直接取,没有像栈这么麻烦。栈中只保存了引用地址,真实数据其实存在堆里,如果想要获取真实的数据,就要通过引用地址去堆里找。

  • 深浅拷贝

  深拷贝和浅拷贝都只针对引用数据类型,浅拷贝会对对象逐个成员依次拷贝,但只复制内存地址,而不复制对象本身,新旧对象成员还是共享同一内存;深拷贝会另外创建一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

  区别:浅拷贝只复制对象的第一层属性,而深拷贝会对对象的属性进行递归复制。

  1.浅拷贝

  浅拷贝的方法:Object.assign()、slice、concat、ES6的...扩展符均为浅拷贝

  2.深拷贝

  深拷贝的方法:

  (1)JSON.parse(JSON.stringify(obj)),缺点是无法对function进行操作

    原理:用JSON.stringify()将对象转成字符串,再用JSON.parse()把字符串解析成对象。(会在堆内存开辟一个新的空间存放这个对象)

  (2)遍历对象对子项赋值来进行深拷贝(一定要考虑到对象中有引用对象的情况)

 

   参考链接:https://www.jb51.net/article/192518.htm  

        https://blog.csdn.net/qq_39353677/article/details/105222873

      

posted @ 2021-03-29 15:10  Zoroaster  阅读(63)  评论(0编辑  收藏  举报