JS里浅拷贝和深拷贝对象的坑

知识点:
1、基本数据类型的特点:直接存储在栈(stack)中的数据
2、引用类型:会将对象复制一份到新分配的变量中,但复制的是指针,而这个指针指向堆中的同一个对象。
3、浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
4、 用JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。

var firstSeriesData = []
var lastSeriesData = []
var errorSeriesData = []
var firstValue = [5,0,0,3,1]
var lastValue = [0,5,0,3,1]
var errorValue =[1,0,5,0,3]
for(var i=0;i<5;i++){
		var op ={}
		op.name = percentList[i]
		op.value = firstValue[i]
		firstSeriesData.push(op)
		op.value = lastValue[i]
		lastSeriesData.push(op)
		op.value = errorValue[i]
		errorSeriesData.push(op)
	}

预计的结果是得到三个不同集合,结果都是得到最后一个集合errorValue[]的值,排查下发现var分配的是地址,那 firstSeriesData、lastSeriesData、errorSeriesData存的是对象地址,所以得到的值都是最后次修改的值。有挺多种方式解决列举两种:1、直接添加匿名对象 2、深拷贝对象

第一种直接添加匿名对象

for(var i=0;i<5;i++){
		firstSeriesData.push({
			name:percentList[i],
			value:firstValue[i]
		})
		lastSeriesData.push({
			name:percentList[i],
			value:lastValue[i]
		})
		errorSeriesData.push({
			name:percentList[i],
			value:errorValue[i]
		})
}

第二种深拷贝

for(var i=0;i<5;i++){
		var op ={}
		op.name = percentList[i]
		op.value = firstValue[i]
		firstSeriesData.push(JSON.parse(JSON.stringify(op)))
		op.value = lastValue[i]
		lastSeriesData.push(JSON.parse(JSON.stringify(op)))
		op.value = errorValue[i]
		errorSeriesData.push(JSON.parse(JSON.stringify(op)))
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值