多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 一、数据结构 - 数组(Array) - 栈(Stack) - 队列(Queue) - 链表(Linked List) - 树(Tree) - 图(Graph) - 堆(Heap) - 散列表(Hash) ## 二、栈和堆 ### stack栈 > 栈是一种遵循**后进先出(LIFO)**原则的有序集合。新添加的或待删除的元素都保存在栈的同一端,称作**栈顶**,另一端就叫**栈底**。在栈里,新元素都接近栈顶,旧元素都接近栈底。stack为自动分配的内存空间,它由系统自动释放。 ### heap堆 > 堆是基于散列算法的数据结构。heap是动态分配的内存,大小不定也不会自动释放。 ## 三、基本类型和引用类型 基本类型:存放在**栈内存**中的简单数据段,数据大小确定,内存空间大小可以分配。 5种基本数据类型有Undefined、Null、Boolean、Number 和 String,它们是直接按值存放的,所以可以直接访问。 引用类型:存放在**堆内存**中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况开进行特定的分配。 当我们需要访问引用类型(如对象(Object {}),数组(Array []),函数(Function)等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。 ## 四、传值与传址 基本类型与引用类型最大的区别实际就是传值与传址的区别。测试用例: ~~~ var a = [1,2,3,4,5]; var b = a; var c = a[0]; alert(b); // 1,2,3,4,5 alert(c); // 1 //改变数值 b[4] = 6; c = 7; alert(a[4]); // 6 alert(a[0]); // 1 ~~~ 从上面我们可以得知,当我改变b中的数据时,a中数据也发生了变化;但是当我改变c的数据值时,a却没有发生改变。 这就是传值与传址的区别。因为a是数组,属于引用类型,所以它赋予给b的时候传的是栈中的地址(相当于新建了一个不同名“指针”),而不是堆内存中的对象。而c仅仅是从a堆内存中获取的一个数据值,并保存在栈中。所以b修改的时候,会根据地址回到a堆中修改,c则直接在栈中修改,并且不能指向a堆内存中。 ![](https://box.kancloud.cn/03546ee1afa58adfd2303e20e4b423cf_549x266.jpg) ## 五、栈与队列的进出方式 - 栈 ![](https://box.kancloud.cn/2ea224ab57ce00b086e0a0b0ebcedf1f_739x361.png) - 队列 ![](https://box.kancloud.cn/d36074bfb718ce3e7fa0b3b0768253eb_800x527.png) 文章参考: [关于JS堆栈与拷贝](http://www.cnblogs.com/chengguanhui/p/4737413.html) [JS数据结构与算法\_栈&队列](https://segmentfault.com/a/1190000017905515)