首页 > 其他分享 >深拷贝和浅拷贝

深拷贝和浅拷贝

时间:2023-02-07 19:12:58浏览次数:42  
标签:stringify 对象 parse JSON 字符串 拷贝

1.前言

基本数据类型:undefined,boolean,number,string,null,symbol(ES6)。 基本类型的名字和值都存放在栈区,访问是按值访问的,就是说你可以操作保存在变量中的实际的值。见下图

当然,let a=1,b=a;虽然b不受a影响,但这也算不上深拷贝,因为深拷贝本身只针对较为复杂的object类型数据。

引用数据类型:是指Object ,Function,Array。可以拥有属性和方法,并且我们可以修改其属性和方法。引用对象存放的方式是:在栈中存放对象变量标示名称和该对象在堆中的存放地址,在堆中存放数据。

注意:对象使用的是引用赋值。当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在堆中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。

深拷贝:复制并创建一个一模一样的对象,不共享内存,修改新对象旧对象不会变。

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

2.实现深拷贝的方式

注意:第一层的属性确实深拷贝,拥有了独立的内存,但更深的属性却仍然公用了地址,所以才会造成上面的问题。同理,concat方法与slice也存在这样的情况,他们都不是真正的深拷贝,这里需要注意。

(1)递归去复制所有层级属性。

(2)利用json对象的parse和stringify。

            JSON.stringify()的作用是将 JavaScript 对象转换为 JSON 字符串,而JSON.parse()可以将JSON字符串转为一个对象。 

            JSON.parse()需要注意一点----由于此方法是将JSON字符串转换成对象,所以你的字符串必须符合JSON格式,即键值都必须使用双引号包裹:

(3)JQ的extend方法。

拓展1:JSON.stringify()的几种妙用。

1.对象的深拷贝,见上面。

2.判断数组是否包含某个对象,或者判断对象是否相等。

 3.让localStorage/sessionStorage可以存储对象。

localStorage/sessionStorage默认只能存储字符串,而实际开发中,我们往往需要存储的数据多为对象类型,那么这里我们就可以在存储时利用json.stringify()将对象转为字符串,而在取缓存时,只需配合json.parse()转回对象即可。

拓展2:JSON.stringify()与toString()的区别

let arr = [1,2,3];
JSON.stringify(arr);//'[1,2,3]'
arr.toString();//1,2,3

其次,JSON.stringify()的受众更多是对象,而toString()虽然可以将数组转为字符串,但并不能对{name:'天子笑'}这类对象实现你想要的操作,它的受众更多是数字。

标签:stringify,对象,parse,JSON,字符串,拷贝
From: https://www.cnblogs.com/131362wsc/p/17099517.html

相关文章

  • 数组扩容与数组拷贝
    前言在上一篇文章中,千锋壹哥给大家讲解了数组的创建、初始化及遍历方式,这些是我们学习数组的基础。其实数组的内容非常多,今天这篇文章,千锋壹哥主要带大家学习数组的扩容、......
  • The Semantics of Constructors——2.2 拷贝构造函数的构造操作
    TheSemanticsofConstructors2.2.1DefaultMemberwiseInitialization(默认的逐成员初始化)如果class没有提供一个explicitcopyconstructor又当如何?当classobject......
  • 深拷贝和浅拷贝
    1、什么是浅拷贝?创建一个对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基础类型,那么拷贝的就是基础类型的值;如果属性是引用属性,那么拷贝的就是内存地址......
  • python 深拷贝和浅拷贝
    python深拷贝和浅拷贝变量:存储对象的引用对象:会分配一块内存空间,存储实际数据引用:变量指向对象,理解为指针变量存储在栈内存,对象存储在堆内存。Python数据类型分为......
  • js深拷贝封装方法
    //使用递归的方式实现数组、对象的深拷贝functiondeepClone1(obj){//判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝varob......
  • Java基础-浅拷贝和深拷贝
    浅拷贝浅拷贝会在堆上创建一个新的对象,如果原对象的属性是一个引用类型,拷贝的内部对象是原对象内部对象的引用地址,即原对象和拷贝对象用的是同一个内部对象。classInner......
  • slice的拷贝:
    1>浅拷贝:只是复制指向对象的指针公用相同的底层数组任何一个数组元素的改变都会影响到双方赋值方式slice1:=slice2(浅拷贝地址复制)2>深拷贝:拷贝的是数据本身......
  • C/C++ 文件IO 拷贝文件,将二进制文件写为十六进制
    查看代码 #include<fstream>#include<iostream>#include<iomanip>//#include"flow.h"unsignedcharbuf[2048];unsignedcharflow[10];voidread_f(){......
  • 记录几个正态分布相关的函数(从GSL里拷贝出来的)
    做芯片测试经常需要分析很多的数据,而正态分布应用最多,这些函数电子表格软件中都有,但是写在测试程序里,直接生成报告会更爽一些,尤其是遇到需要反复验证数据的情况。///////......
  • C#高性能数组拷贝实验
    前言昨天wc(Wyu_Cnk)提了个问题C#里多维数组拷贝有没有什么比较优雅的写法?这不是问对人了吗?正好我最近在搞图像处理,要和内存打交道,我一下就想到了在C#里面直接像C/......