11 栈和堆

Posted by CodingWithAlice on April 11, 2021

11 栈和堆

几个基础概念:

静态语言:在声明变量之前需要先定义变量类型,例如C 动态语言:在运行过程中需要检查数据类型的语言,例如JS

弱类型语言:支持隐式类型转换的语言 强类型语言:不支持隐式类型转换的语言

image-20210411143958862

JS是一种弱类型(不需要提前声明类型,JS在运行代码时自己计算),动态类型(一个变量可以保存多种类型的数据)语言。【热知识:js中字符串不能被修改

js数据类型

image-20210411144048172

原始类型:前面的 7 种数据类型 – 存在栈中 引用类型:对象类型 – 存在堆中

存储空间

JavaScript 的 变量是没有数据类型 的,值才有数据类型,变量可以随时持有任何类型的数据

function foo(){
    var a = " 极客时间 "
    var b = a
    var c = {name:" 极客时间 "}
    var d = c
}
foo()

如上代码的执行栈如下图,JavaScript 引擎执行到 var c = {name:" 极客时间 "} 时判断右边的值是一个引用类型,将它分配到堆空间里面,分配后该对象会有一个在“堆”中的地址,然后再将该数据的地址写进 c 的变量值:

image-20210411144222302

为什么要划分堆和栈,全部都放在栈里面不行么?

​ JavaScript 引擎需要用 来维护程序 执行期间上下文的状态 ,如果栈空间大了话,所有的数据都存放在栈空间里面,那么会影响到上下文 切换的效率 ,进而又影响到整个程序的执行效率。

​ 所以通常情况下,栈空间都不会设置太大,主要用来存放一些原始类型的小数据。而引用类型的数据占用的空间都比较大,所以这一类数据会被存放到堆中,堆空间很大,能存放很多大的数据,不过缺点是 分配内存和回收内存 都会占用一定的时间。

image-20210411144337024