11 栈和堆
几个基础概念:
静态语言:在声明变量之前需要先定义变量类型,例如C 动态语言:在运行过程中需要检查数据类型的语言,例如JS
弱类型语言:支持隐式类型转换的语言 强类型语言:不支持隐式类型转换的语言
JS是一种弱类型(不需要提前声明类型,JS在运行代码时自己计算),动态类型(一个变量可以保存多种类型的数据)语言。【热知识:js中字符串不能被修改】
js数据类型
原始类型:前面的 7 种数据类型 – 存在栈中 引用类型:对象类型 – 存在堆中
存储空间
JavaScript 的 变量是没有数据类型 的,值才有数据类型,变量可以随时持有任何类型的数据
function foo(){
var a = " 极客时间 "
var b = a
var c = {name:" 极客时间 "}
var d = c
}
foo()
如上代码的执行栈如下图,JavaScript 引擎执行到 var c = {name:" 极客时间 "}
时判断右边的值是一个引用类型,将它分配到堆空间里面,分配后该对象会有一个在“堆”中的地址,然后再将该数据的地址写进 c 的变量值:
为什么要划分堆和栈,全部都放在栈里面不行么?
JavaScript 引擎需要用 栈 来维护程序 执行期间上下文的状态 ,如果栈空间大了话,所有的数据都存放在栈空间里面,那么会影响到上下文 切换的效率 ,进而又影响到整个程序的执行效率。
所以通常情况下,栈空间都不会设置太大,主要用来存放一些原始类型的小数据。而引用类型的数据占用的空间都比较大,所以这一类数据会被存放到堆中,堆空间很大,能存放很多大的数据,不过缺点是 分配内存和回收内存 都会占用一定的时间。