1.为什么写下这篇文章?(直接看代码,可下滑至2.)
我在开发项目的过程中,定义了一个any类型a,还有一个any数组b(在这篇文章中用a,b来代替啊,并不是说我的项目就是用a,b写的啊),我想实现的是在一个方法结束时,将a的值推入b中,然后修改a中index或者type的值,有时候只修改一个,有时候两个一起修改,再次等方法结束将a推入b。。。
具体我就不写了,在这里我只是剖析一下
private a:any = {index:0,type:"横"};//初始设为1
private b:any[]=[];//初始设为空
在方法结束我将a的值赋值给了b[0],修改a中的值
end()
{
this.b[0] = this.a;
//在这里我碰到了两种情况
//1.直接改变a(测试注释掉第二种情况)
this.a = {index:1,type:"横"}
this.b[1] = this.a;
console.log(this.b)//这里打印出来的this.b为[{index:0,type:"横"},{index:1,type:"横"}]
//2.不直接改变a,而是只需要改变a里面的index,就可以(测试注释第一种情况)
this.a.index = 2;
this.b[1] = this.a;
console.log(this.b);//这里打印的this.b为[{index:2,type:"横"},{index:2,type:"横"}]
}
为什么会造成这种情况???因为涉及到一些指针和地址的知识,感兴趣的网上找一些资源看一下。
我用我的理解说一下这个问题在,初始时候我给了a一个值,并且给了a一个值{index:0,type:“横”},可以理解为,{index:0,type:“横”}是a所指向的地址,在end()方法中第一种情况,我们给了a一个新的值this.a = {index:1,type:“横”},这条代码的作用是新开辟了一个地址给a,所以我们打印出来的b,其实是从一个{index:0,type:“横”}和一个{index:1,type:“横”}的地址读出来的数据。
第二种情况this.a.index = 2;这条语句并没有给a再开辟一个地址,而是相当与给a里面的index开了一个新地址(这句我我解释的可能有问题,如果有人看到,可以评论一下,因为这里我也不是很懂,谢谢),既然a没有新地址,还是在原来的地址上修改的,那么this.b[0] = this.a,读的是this.a的地址,this.b[1] = this.a,说明两个指向的地址是一样的,所以this.a.index改变会造成this.b[0]和this.b[1]相等,并没有达到我想要的结果,就是说并没有达到,我只想修改a中index或type的值,而使得this.b[0]和this.b[1]不同的效果,也就是说我们需要写一个深拷贝来达到这种效果。
2.深拷贝代码(试用TS)
clone(value: any)
{
if (!value || typeof value != "object")
{
return value;
}
let out: any = value.contructor === Array ? [] : {}
let _clone: Function = ((o: Object, c: any) =>
{
for (let i in o)
{
if (o[i] && typeof o[i] === "object")
{
if (o[i].contructor === Array)
{
c[i] = []
}
else
{
c[i] = {}
}
_clone(o[i], c[i]);
}
else
{
c[i] = o[i]
}
}
return c;
})
return _clone(value, out)
}
3.使用clone方法,解决刚刚我没能想得到的结果
end()
{
//在这里我碰到了两种情况
//1.直接改变a(测试注释掉第二种情况)
this.b[0] = this.a;
this.a = {index:1,type:"横"}
this.b[1] = this.a;
console.log(this.b)//这里打印出来的this.b为[{index:0,type:"横"},{index:1,type:"横"}]
//2.不直接改变a,而是只需要改变a里面的index,就可以(测试注释第一种情况)
this.b[0] = this.a;
this.a.index = 2;
this.b[1] = this.a;
console.log(this.b);//这里打印的this.b为[{index:2,type:"横"},{index:2,type:"横"}]
//3.使用clone方法(测试注释1,2)
this.b[0] = this.clone(this.a)
this.a.index = 3;
this.b[1] = this.clone(this.a)
console.log(this.b);//这里打印出来的this.b为[{index:0,type:"横"},{index:3,type:"横"}]
}