在js中,每一个数据都需要一个内存空间。内存空间又被分为两种,栈内存(stock)和堆内存(heap)
基础数据类型与栈内存
JS中的基础数据类型,这些值都有固定的大小,往往都保存在栈内存中,由系统自动分配存储空间。我们可以直接操作保存在栈内存空间的值,因此基础数据类型都是按值访问,传递也是值传递
数据在栈内存中的存储与使用方式类似于数据结构中的堆栈数据结构,遵循先进后出的原则。
这边举例说明一下栈内存空间的存储方式,以羽毛球为例
羽毛球盒中的羽毛球像这样存储,处于盒子中最顶层的羽毛球5,他一定是最后被放进去的,但可以最先被使用。如果我们想要使用1号羽毛球的话,就必须把上面4个羽毛球取出来,让1号处于顶层。这就是栈空间先进后出,后进先出的特点。
引用数据类型与堆内存
与其他语言数据类型不同,js的引用数据类型,比如数组array,他们值的大小是不固定的。引用数据类型的值是保存在堆内存中的对象。js不允许直接访问堆内存中的位置,因此我们不能直接操作对象的堆内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象,因此,引用类型的值都是按引用访问的。这里的引用,我们可以粗浅的理解为保存在栈内中的一个地址,该地址指向堆内存的位置。
下面举例加深对栈内存和堆内存的理解
[栈内存空间] ——->
1 | 堆内存空间 |
因此当我们要访问堆内存中的引用数据类型时,实际上我们首先是从栈中获取了该对象的地址,然后再从堆中取得我们需要的数据。
- 本文作者: gtt
- 本文链接: https://gtt011029.github.io/posts/52257/