JS 中的堆内存和栈内存
- 说到堆内存和栈内存就是用来存储数据的,所以我们先来复习一下JS的数据类型.
JS的数据类型
- 为了更加简便的理解堆内存和栈内存,首先我们一起来复习一下JS的数据类型.在JS中数据类型分为两大类
- 基本数据类型
String Number Boolean undefined Null 这五种数据类型按值存放在堆内存中.- 引用数据类型
Function Array Object 这三种变量的数据存放在堆内存中,栈内存中存放指向该堆内存中的指针.
什么是堆栈
- 栈(stack) 由编译器自动分配释放,存放函数的参数值,基本类型变量值等.器操作方式类似于数据结构中的栈.
- 堆(heap) 一般由程序员分配释放,若程序员不释放程序结束后可能由OS回收.他和数据结构中的堆是两回事,分配方式倒是类似于链表.
堆和栈的区别
- 栈:栈内存在JS是存放基本数据类型的值和引用数据类型的指针,这就是为什么修改引用数据类型的值时,指向同一个地址的另一个变量也会跟着改变的原因.
- 优点:
- 栈中的内容是操作系统自动创建,自动回收,占据固定大小的空间,因此没存可以及时得到回收,相对于堆来说,更加容易管理内存空间.
- 相比于堆来说栈的存取速度会快,并且栈内存中的数据是可以共享的,例如同时声明了var a = 1和var b =1,会先处理a,然后在栈中查找有没有值为1的地址,如果没有就开辟一个值为1的地址,然后a指向这个地址,当处理b时,因为值为1的地址已经开辟好了,所以b也会同样指向同一个地址。
- 缺点:
相比于堆来说的缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
- 堆:堆内存中存储的对象不会因为函数调用的结束而销毁,就算结束,这个对象也可能会被其他变量所引用.因为创建对象的代价比较大,所以创建对象是为了反复引用的,这个对象将被保存到堆内存中.只有这个对象没有任何变量引用他时,他才会被垃圾回收机制回收.
- 优点:
- 堆是动态分配储存大小的,比较方便存储和开辟内存空间.
- 堆内存中保存的对象不会自动释放,一般由程序员释放,或者是垃圾回收机制回收,比较灵活
- 缺点
相对于栈内存来讲 堆内存存储数据比较无序杂乱.