关于JS中数据存储的一些认识
在JS(Javascript)中,要想清除的了解数据存储,首先要明白两样东西,即数据类型、堆和栈。下面我们先分开讲,什么是数据类型,什么是存储类型。
1. 数据类型
数据类型分为六种,我们将其归为两类,一类是基础数据类型,一类是引用数据类型,顾名思义,数据类型就是我们对数据的一种划分,就像我们平时对食物的划分为素食,肉食这样不同的分类。数据有很多种,我们为了方便也会对其进行划分。另一方面,数据类型的划分也是必须的。
数据类型划分的必要性:
数据我们会存在计算机中,但是计算机的存储空间是有限的,但是我们的数据有的大有的小,就好像我们寄快递一样,大的快递用大的箱子,小的快递用小的箱子,这样才可以将我们存放的空间有效的利用,所以我们计算机给数据分的存储空间的大小也会根据数据类型的不同而不同,这样我们才可以更好的利用计算机的存储空间。
必要性:
为了更加合理的使用我们的内存空间,基本所有的编程语言中都提出了数据类型的概念,他就是去研究针对不同的数据,分配不同的空间.
说完数据类型,我们来讲基础数据类型和引用数据类型,不同的语言对数据类型的划分不尽相同,多少存在一些差异性。而在JS中,我们对数据有如下划分:
基础数据类型:
| 类型 | 值 |
|---|---|
| Number | 12(或者任意一个数字) |
| 布尔类型(boolean) | true或false |
| String | “asd”(用引号引起来的属于字符串) |
| undefined | 无法识别 没有值 |
| Null | 空值 |
| Symbol | 变量名 |
在这里简单提一下Symbol,它属于ECMAScript 6 新定义一个数据类型,通过Symbol()函数来定义,目的是从根本上防止了变量名相同所带来的冲突。
引用数据类型:
引用数据类型只有一种,即Object。这个Object可以是数组array[ ],也可以是function(){}函数。我们常用的就是这两种。
从这里我们不难发现,两类数据类型的划分,基础数据类型中都是我们常用的一些出现频率很高的,占空间很小的数据,而后者引用数据类型则是占位较大的一些数据。所以,针对不同的数据我们会划分不同大小的存储空间给他,下来我们来讲存储空间的划分。
2. 堆和栈
什么是堆,什么是栈?
实际上,堆和栈是系统对存储空间的两种管理方式,这里既然提到了堆和栈,那肯定和上文所说的基础存储类型和引用存储类型这两类数据类型的存储有关,既然两类数据类型占用内存的大小都不相同,那么我们的堆和栈的空间大小也不会相同,毕竟不可能用两个一样大的容器去装一大一小的东西,这样多浪费。所以这里我们先阐述堆和栈的区别:
(1)管理方式不同,栈是由系统自动分配的。而堆的申请和释放是由我们来进行操作的,操作不当就会产生内存泄漏。
(2)空间的大小不同,栈的大小远远小于堆的大小,进程栈的大小64bits的Windows默认 1MB,64bits的Linux 默认10MB。
(3)生长方向的不同,堆的生长方向是向上,内存地址从低到高;栈的生长方向向下,内存地址从高到低。
(4)分配方式不同,堆是动态分配,栈既有动态分配又有静态分配。
(5)分配效率不同。
(6)存放内容不同。
但这里我们不难发现,栈所占的内存空间小,堆所占的内存空间相比较大,基础数据类型所占的内存空间小,引用数据类型所占的空间大。所以我们心中大概已经有了自己的答案,没错,栈内部存储的是基础数据类型的值,而堆所存储的是引用数据类型的值。
下来我们通过一段代码来说明:
<script>
var a = 0;
function f(){
var b=10;
console.log(b);
}
</script>
这段代码中,我们去执行时,产生了执行栈,主函数执行的时候产生全局上下文,放入了栈底,然后预编译过程中声明提升,所以在栈空间中存放了变量名a和f,a的值是0,那么,f的值是什么呢。
我们在声明f的时候,发现他是一个函数,所以为了存储他,我们会产生一个堆空间,用来存放函数f的代码段,既然产生了堆空间,那么就会有一个堆空间的地址,而我们的f的值就是这个地址,用来指向函数段所在的堆空间。

如上图所示,我们的栈内用来存储变量的vo里面存储的变量名和它的值,而f所对应的就是函数体所在堆空间的地址。那如果我们执行函数f(),他里面的东西存到哪里呢?
函数的执行会产生所对应的上下文,如果我们调用函数f(),就会开辟一个新的上下文,而在新的上下文中有一个类似于VO的地方我们称之为AO,他用来存储我们在函数中声明的临时变量。

总结
经过上面的叙述,相信大家对存储类型和数据存储的分配有了自己的认识,其实就好像生活中摆放物品一样,只有把一样东西放一到一个合适的容器里面,才会更好的利用容器。在这里,数据就是东西,内存就是容器,我们只有合理的分配,才会使内存利用最大化。
本文深入解析JavaScript中的数据存储原理,包括基础数据类型与引用数据类型的存储区别,以及堆和栈的管理方式。通过实例讲解,帮助理解不同数据类型在内存中的分配与存储。

被折叠的 条评论
为什么被折叠?



