JavaScript中的深拷贝问题

JavaScript中的深拷贝问题

在阅读下面文章之前,让我们来先了解什么叫做深拷贝?

学习JavaScript的入门一定是从数据类型进行

变量存储类型分两类
①基本类型:直接存储在栈中的数据。(字符串、布尔值、未定义、数字、null)
②引用类型:将该对象引用地址存储在栈中,然后对象里面的数据存放在堆中。(数组、对象、函数)

浅拷贝和深拷贝的区别

对于浅拷贝,程序拷贝的是对象的引用,而不是对象的值
而对应的深拷贝,则是拷贝的是对象的值,也就是在拷贝的同时会出现两个不同的引用,当不同引用重新赋值时,不会改变原来数据的改变

浅拷贝

基本数据类型进行copy的时候,通常会将值一起改变

	var a = 3
	var b = a
	a=5
	console.log(a)   //  5
	console.log(b)  //  5`

引用类型的浅拷贝

	var obj1 = {
	    a:  1,
	    b:  2,
	    c:  3
	}
	var obj2 = obj1;
	obj2.a = 5;
	console.log(obj1.a);  // 5
	console.log(obj2.a);  // 5

在执行完上面代码的时候,两个对象的值全部改变。对于引用类型,将obj1赋给obj2的时候,只是在堆内存中obj1的引用指向了obj2,那么两个对象就公用了同一个值,当obj2重新赋值时,修改的时堆内存中公用数据,所以obj1的值也会发生改变。

深拷贝

我们在实际的项目中,有时会需要利用相同的值做不同的数据操作,那么我们就会利用到深拷贝
深拷贝作用在通常引用类型上!例如:Object,Array
深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型,这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据,而不用担心数据之间会起冲突

JSON.stringif()和JSON.Parse()

我们知道stringif()方法,就是说把原来是对象的类型转换成字符串类型
而Parse()就是将字符串类型转化为 JSON格式,也就是对象、

如果不理解这两种方法的使用,可以参考下面的文章
点击链接https://www.cnblogs.com/SmallStrange/p/10641630.html
stringif()和parse()其实一个深拷贝的引用,但是这两个方法有使用局限性,因为在使用时是不可以拷贝 undefined , function, RegExp 等等类型的

	var obj1 = { a: 1,b: 2,c: 3}
	var objString = JSON.stringify(obj1);
	var obj2 = JSON.parse(objString);
	obj2.a = 5;
	console.log(obj1.a);  // 1
	console.log(obj2.a); // 5

Object.assgin()

	var obj1 = { a: 1,b: 2,c: 3}
	var obj2 = Object.assign({}, obj1);
	obj2.b = 5;
	console.log(obj1.b); // 2
	console.log(obj2.b); // 5
这里简单概述了深拷贝和浅拷贝的区别

下面文章对assgin的用法的具体讲述
https://blog.csdn.net/Calla_Lj/article/details/89478765

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值