TS之一段深拷贝代码

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:"横"}]
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值