知识点:
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)))
}