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 }

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

    原文作者:0zien0
    原文地址: https://blog.csdn.net/a42626423/article/details/88990250
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞