Bootstrap

JS深拷贝与浅拷贝的理解(python等语言大致理念相同)

今天来说一说这个深浅拷贝的问题,为什么会突然来解释这个问题呢?因为这个也是一个喜欢的女孩子遇到的问题,上次只顾着解决问题了,没有机会给她解释。所以今天就尽量谢的详细一点

我们需要知道,在什么情况下会发生深浅拷贝

首先,会发生深浅拷贝问题的数据类型为复杂数据类型,
一个数据是由另一个数据赋值(例如:let B = 2, let A = B),在改变该数据的时候(例如:A =1),会改变另外一个数据的值(结果:B的实际值变为了1)
那接下来先来简单了解下数据的类型

基本数据类型

基本数据类型分为:string、number、boolean、null、undefined、symbol

复杂数据类型

复杂数据类型分为:function、array、object

这里我们来解释下,为什么会发生深浅拷贝的问题

众所周知,数据的存储会区分为
基本数据类型存放在栈内存中
复杂数据存放于堆内存中
那么发生深浅拷贝的问题的原因就是,变量在内存中,指针指向的问题

基础数据类型的存储

打个比方:
这里我定义了一个变量
let A = 1 那么这个变量就会在堆内存中开辟一个空间,来存放这个变量,
此时我们在定义一个变量
let B = A 很明显,这个操做是将A 赋值给B
那么此时的存储结构为下图:
在这里插入图片描述
这里阔以清楚的看出A 和 B为一个房间内两个毫不相干的人
代码示例:

let A = 1
let B = A
console.log('A的值为:', A);
console.log('B的值为:', B);
B = 250
console.log('更改后A的值为:', A);
console.log('更改后B的值为:', B);

运行结果:
在这里插入图片描述

从结果中阔以看出,基本数据类型在交叉赋值之后,不会影响其他任何一个原始数据的值,互相独立,互不干扰

复杂数据类型的存储(堆内存中)

在堆内存中,会存在一个指针的概念,用于指向已经开辟空间的变量
这里我们定义一个初始变量

let	A= { value1:123}

那么A现在在内存中的样子是这样的
在这里插入图片描述

接下来我么你再创建一个变量B,执行一个动作,就是B的值从A中拿取,这个动作也被称之为拷贝顾名思义,就是B拷贝A的值,给自己

//	其中变量A的值再上一步咱们定义过了,这里就在重复提示一下	A = {value1:123}
let B = A

那么现再的复杂数据类型类型A和B之间就会发生拷贝的问题,原因这里由A对B赋值,只是单单复制了一个存储的指针,也就是说A和B的本质是同一个东西。如图所示

在这里插入图片描述
所以,我们无论是改变变量A还是变量B,其本质都是改变指针A,只要指针A发生变化,那么指针A内的所有变量的值都会同步改变
上代码看效果

首先我们测试改变A后的影响

let A = { value1: 123 }
let B = A
console.log('A的值为:', A);
console.log('B的值为:', B);
A.value1 = 250
console.log('改变A后=》A的值为:', A);
console.log('改变A后=》B的值为:', B);

阔以发现这里我们虽然只重新改变了A的值,但是B也同样的发生了变化
在这里插入图片描述
其次我们测试下改变B的值

let A = { value1: 123 }
let B = A
console.log('A的值为:', A);
console.log('B的值为:', B);
B.value1 = 520
console.log('改变B后=》A的值为:', A);
console.log('改变B后=》B的值为:', B);

结果和上一步我们改变A的值所产生的影响是一样的 两个变量的值都同步发生了改变
在这里插入图片描述

由上面的示例应该不难看出,这就是深浅拷贝所产生的恶劣影响。它的副作用可能会再代码里面对我们产生一些难以追踪的问题。让我们尝试困扰。所以,再理解了拷贝的原理之后,咱们接下来再下一篇文章中,来解决这个副作用。

;