typescript浅拷贝与深拷贝

浅拷贝与深拷贝的个人理解:
假设B去拷贝A的内容。
浅拷贝:B与A共用同一个内存地址,读取的值都指向同一块内存地址,所以无论A还是B对值进行修改,最终改的是内存地址里面的值,即改了A,B同时值也会改变。
深拷贝:B开辟一块新的内存地址,然后把A的值复制到B所在的内存地址上,修改B时,不会改变A。

很多的时候,我们需要复制一个结构时,都希望改变B而不会影响到A,即深拷贝,那么typescript如何完成深拷贝呢:

1.【伪】深拷贝:
使用typescript提供的接口:(Object).assign();

var test = {zien:23,sad:13, clz:{ling:1}};

var test2 = {};
(<any>Object).assign(test2, test);

test2["zien"] = 30;
test2["clz"]["ling"] = 2;

for (var k in test){
	console.log(k, test[k]);
}
console.log("------------------------------------------");
for (var k in test2){
	console.log(k, test2[k]);
}

输出结果如下:

zien 23
sad 13
clz { ling: 2 }
------------------------------------------
zien 30
sad 13
clz { ling: 2 }

可以看到修改了B的zien,A的zien并没有改变,所以算是深拷贝。
但为什么称之为【伪】深拷贝,因为看到修改了test2[“clz”][“ling”] = 2;之后,A和B的值都改了,所以可以定义为,这种拷贝方式只能深拷贝第一层的数据,包含有更深层次的数据并不会进行深拷贝。

2.【真】深拷贝:
一个简单的思路就是把需要拷贝的内容通过json转成字符串,然后再用json把字符串转成对应的对象类型。

var test = {zien:23,sad:13, clz:{ling:1}};
var test3 = JSON.parse(JSON.stringify(test));

test3["zien"] = 30;
test3["clz"]["ling"] = 2;

for (var k in test){
	console.log(k, test[k]);
}

console.log("------------------------------------------");
for (var k in test3){
	console.log(k, test3[k]);
}

输出结果:

zien 23
sad 13
clz { ling: 1 }
------------------------------------------
zien 30
sad 13
clz { ling: 2 }

测试结果确实是我们想要的,进行了一次完美的深拷贝。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值