【js重学系列】栈和堆

栈和堆

    1. 栈 (计算机术语)
      一种先进后出的数据结构。
      
       
    2. ```
       栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
    
    1. 引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。
      栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
      栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表
      
    1. 堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。
      
  1. 栈内存 堆内存

    1. 1. 在js引擎中对变量的存储主要有两种位置,**堆内存和栈内存**。
      2. 基本数据类型的变量名和数据是直接存在"快速内存"(栈内存)中
      3. 复合数据类型(对象和数组)的存储分两个部分:实际数据存在"慢速内存"(堆内存)中,栈内存中只存变量名和数据在堆内存中的位置(地址)
      4. **栈内存**主要用于存储各种**基本类型的**变量,包括Boolean、Number、String、Undefined、Null,以及对象变量的**指针**
      5. 堆内存主要负责像对象Object这种变量类型的存储
      
    2. 内存的使用和分配
      堆是动态分配内存,内存大小不一,也不会自动释放。
      栈是自动分配相对固定大小的内存空间,并由系统自动释放。
      
      

这里先说两个概念:1、堆(heap)2、栈(stack)
堆 是堆内存的简称。
栈 是栈内存的简称。
说到堆栈,我们讲的就是内存的使用和分配了,没有寄存器的事,也没有硬盘的事。
各种语言在处理堆栈的原理上都大同小异。堆是动态分配内存,内存大小不一,也不会自动释放。栈是自动分配相对固定大小的内存空间,并由系统自动释放。

  javascript的基本类型就5种:Undefined、Null、Boolean、Number和String,它们都是直接按值存储在栈中的,每种类型的数据占用的内存空间的大小是确定的,并由系统自动分配和自动释放。这样带来的好处就是,内存可以及时得到回收,相对于堆来说,更加容易管理内存空间。
  
  javascript中其他类型的数据被称为引用类型的数据 : 如对象(Object)、数组(Array)、函数(Function) …,它们是通过拷贝和new出来的,这样的数据存储于堆中。其实,说存储于堆中,也不太准确,因为,引用类型的数据的地址指针是存储于栈中的,当我们想要访问引用类型的值的时候,需要先从栈中获得对象的地址指针,然后,在通过地址指针找到堆中的所需要的数据。
  
  说来也是形象,栈,线性结构,后进先出,便于管理。堆,一个混沌,杂乱无章,方便存储和开辟内存空间
  ```
  1. https://www.cnblogs.com/baoshuyan66/p/13071313.html

  2. https://blog.csdn.net/sinat_15951543/article/details/79228675

原文地址:https://www.cnblogs.com/ycyc123/p/14330822.html