js深克隆,浅拷贝

在js中,数据类型分为基本数据类型和引用数据类型,基本数据类型的值存在在栈中,而引用类型,他在栈内仅仅只存储一个引用,而真正的数据类型存储在堆内存中
当我们对数据进行操作的时候,会发生两种情况
一、基本数据类型

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

可以看到的是对于基本类型来说,我们将一个基本类型的值赋予 a 变量,接着将 a 的值赋予变量 b ;然后我们修改 b ;可以看到 b 被修改了,而 a 的值没有被修改,两个变量都使用的是独立的数据;
二、引用数据类型

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

可以看到的是,两个对象的值全部被修改了

浅拷贝

两个对象指向同一个对象,两个对象是不同名称,但两个对象会相互影响。
上面的例子就是一个简单的浅拷贝
什么是深克隆:在实际的项目中,肯定不能让每个对象的值都指向同一个堆内存,这样的话不便于我们做操作,所以自然而然的诞生了深拷贝
深拷贝作用在引用类型上!例如:Object,Array
深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型,这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据,而不用担心数据之间会起冲突
举个简单的小例子

function checkType(data){
				//数组也属于对象的一种
				// var obj={}
				// console.log(typeof(obj))
				// var arr=[]
				// console.log(typeof(arr))
				//常用的判断数据类型的方法
				// var obj={}//对象
				// console.log(Object.prototype.toString.call(obj).slice(8,-1))
				// var arr=[]//数组
				// console.log(Object.prototype.toString.call(arr).slice(8,-1))
				return Object.prototype.toString.call(data).slice(8,-1)
			}
			//对象和数组的深克隆
			function deepClone(target){
				var result;
				var targetType=checkType(target)
				if(targetType=='Object'){
					result = {}
				}else if(targetType=='Array'){
					result =[]
				}else{
					return target
				}
				for(var i in target){
					var value = target[i]
					var valueType =checkType(value)
					if(valueType=='Object'||valueType=='Array'){					
						result[i]=deepClone(value)
					}else{
						result[i]=value
					}
				}
				return result
			}
			var arr1=[1,2,{age:33}]
			 var arr2=deepClone(arr1)
			 arr2[2].age=34
			 console.log(arr2)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值