参考文章 https://juejin.im/post/59ac1c4ef265da248e75892b js 深拷贝 vs 浅拷贝
数据分为基本数据类型和引用数据类型
其中赋值操作,也就是等号操作对于基本类型和应用类型来说是有区别的。其实赋值操作就是对栈中的值进行拷贝。
基本数据类型在栈里存的就是实际的值,而引用数据类型的值则在栈中存的是地址。
所以就会有这样一种现象,基本类型数据的“=”操作之后原变量与被赋值的变量是独立的。即a=1;b=a;b=2;(执行完之后,a 的值依然是a===1)。引用类型的赋值则不一样,引用类型的数据存在栈中存的是地址,而我们之前理解的是赋值操作就是赋值的栈里面的东西。所以引用类型的赋值是复制的地址,这样就相当于把原变量和被赋值的变量指向的是同一地址,这个地址找到堆对应的位置存储的数据。所以应用类型的赋值后原变量和被赋值变量是关联的。a={a:1,b:2};b=a b.a=5;执行完以上的操作之后a.a===5)
首先明确一个概念,就是赋值(=),浅拷贝,深拷贝三者是有区别的。
浅拷贝我的理解就是遍历了引用类型的属性名称,对属性名称进行了遍历,将进行浅拷贝的数据进行了一次属性赋值(本质上就是基本数据类型的赋值),而这就会有一个影响,就是在某个属性又包含子属性的时候,直接赋值操作就会导致赋值的是地址而不是实际的值,这就造成浅拷贝的赋值操作只会使赋值后的第一层属性时独立的,而第二层,第三层又是赋值的地址。所以就会出现修改第一层不会影响到原来的值,修改第二层往后就会相互影响。
而深拷贝则是不停的进行浅拷贝,知道最终到最后一层赋值。这样实现的就是两个变量的完全独立,修改其中一个不会影响对方。