TypeScript的浅拷贝

前言:

大家应该对TypeScript已经有了不少的了解,在做项目也发现了他的重要性。

现在对TypeScript的深拷贝与浅拷贝做一下总结

基本思想:

所谓深拷贝与浅拷贝,是围绕引用类型变量的拷贝进行的讨论
    在TypeScript中,变量分为基本类型和引用类型两种。其本质区别是不可变性,基本类型是不可变的,而引用类型是可变的。

 

什么是基本类型的不可变性,比如

let a = 1;
let b = 1;
a++;
console.log("a的值是:"+a,"b的值是:"+b);
//打印结果如下:
/*
a的值是2,b的值是1
*/

声明变量a,赋值为1,声明变量b,赋值为1,当执行a++时,结果为2,但这个值不会将原来他的值覆盖,所以对于1来说,他是用不可变的。

浅拷贝

介绍一下简单的浅拷贝,下面这个表现的也十分明显。对拷贝原的操作,会直接体现在拷贝目标上

let shallowA = {
    x: 1,
    y: -1
}
let shallowB = shallowA;
shallowA.x++;

console.log("shallowA.x==="+shallowA.x,"shallowB.x==="+shallowB.x,)
//打印结果如下:
shallowA.x === 2 
shallowB.x === 2

假如我们需要获得与拷贝源完全相同,却又不会互相影响的对象,应该怎么办呢。

let shallowA = {
    a: 1,
    b: 2,
    c: {
        d: 1,
    }
}
let shallowB = {};
Object.assign(shallowB, shallowA);
shallowA.a++;

console.log("shallowA.a==="+shallowA.a,"shallowB.a==="+shallowB.a,);
//打印结果如下:

shallowA.a === 2 
shallowB.a === 1

表面上看,好像已经实现了深拷贝的效果,对shallowA.a进行的操作并没有体现在shallowA.a中,但是呢,关键的时候来了,这也是我今天为什么要写这个博客的主要问题所在。

shallowA.c.d++;

console.log("shallowA.c.d==="+shallowA.c.d,"shallowB.c.d==="+shallowB.c.d);

//打印结果如下:
shallowA.c.d === 2 
shallowB.c.d === 2

从上面的打印结果看出,Object.assign()的拷贝类型十分明显了,这是一种可以对非嵌套对象进行深拷贝的方法,如果对象中出现嵌套情况,那么其对被嵌套对象的行为就成了普通的浅拷贝

还有一种是深拷贝,他比浅拷贝的功能更加强大,大家可以去学习一下。

你可能感兴趣的:(TypeScript的浅拷贝)