1. js 一切皆对象 ,它的数据类型分为引用(复杂)数据类型,还有简单数据类型

  2. 这里说到了数据,那么数据是怎么存储的呢? 数据都是往内存里面存的

  3. 接下来我们讲一讲简单数据类型和引用数据类型的存储方式吧!


简单数据类型和引用数据类型的存储方式

1.简单类型的存储方式:

说明: 首先会在内存开辟一份空间,我们把它叫做栈,简单数据类型就会把值直接存在栈里面了

  1. let n = 2

看图:

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/21762447/1624457766723-d46b3f0c-a5ef-4788-878f-5529d8ba6e54.png#clientId=u89d2ac19-29c6-4&from=paste&height=186&id=ue5afc8e6&margin=%5Bobject%20Object%5D&name=image.png&originHeight=186&originWidth=378&originalType=binary&ratio=1&size=10427&status=done&style=none&taskId=uc6fe69a1-60d3-4d1c-a9ff-add77c751d0&width=378)

2.引用类型的存储方式:

  1. let obj = { name:'张三' , age:18 }

说明:

首先也是先找一个内存空间,我们把它叫做栈内存,但是他是引用数据类型的,它就又会开辟一份堆

内存,它会把这个对象{}保存在堆里面,对象在内存当中保存,需要有一个地址找到它,就好比存数据需

要一个的地址,它会把这个地址保存在栈里面(是二进制或者十六进制的地址),地址又指向堆里面的对

象,

图示说明:

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/21762447/1624458662354-587ff2ec-1380-4f36-81ac-64039dca9794.png#clientId=u89d2ac19-29c6-4&from=paste&height=296&id=u9e7b4cdd&margin=%5Bobject%20Object%5D&name=image.png&originHeight=296&originWidth=607&originalType=binary&ratio=1&size=20408&status=done&style=none&taskId=ue3f8d260-bef4-4d44-9e55-0953ce395dc&width=607)

这就是它们的存储方式,我们现在明白了


简单类型和复杂类型在赋值的时候,存储方式又有什么不同呢?

说明:

我们经常拿数据传来传去,那么这个时候堆和栈就会发生改变

1. 简单类型:

  1. let n = 6
  2. let m = n

现在相当于是把n赋值给了m,它会怎样存储呢?

首先n在栈里面开辟了空间存放6,这个上面讲了,然后这个时候,m也会在栈里面开辟一块空间,然后n在赋值给m的时候一看,是简单数据类型的,n就当场把自己的数据copy一份给m,这个时候数据就有两份了,n一份.m一份:

image.png image.png
image.png

然后如果我把n改成9,m会不会变呢? 是不会变的,我们说了,现在数据是两份,他们互不干扰 : image.png

那么复杂类型怎么传呢?

  1. let obj = { name:'张三' , age:18 }
  2. let o = obj

说明:

按照理解obj应该把数据给o一份,但是不是这样的,obj是把地址给copy出来了一个一模一样的给o,

然后地址指向了堆中的对象数据,

首先obj会把地址保存在栈里面,对象放在堆里面,地址指向堆里面的对象,这个我上面也说到了,那么这种是引用类型关系的赋值的时候,就会把地址复制一份,从而指向同一个对象数据,这个时候o和obj看上去是一样的,但是在复杂数据类型中,一样的原因是因为把地址复制了一份,数据还是一份,看图: image.png

image.png

那么问题来了: o和obj看起来一样是因为o和obj两份地址指向的是同一份对象数据,我怎么验证他们两个是同一个数据?

  1. let obj = { name:'张三' , age:18 }
  2. let o = obj
  3. obj.name = '李寻欢'

会出现什么效果呢? 看图:

image.png 发现了什么? 他们两个真是一样的 , 为什么?


因为复杂数据类型传的是地址,不会把数据复制一份