深刻理解javascript系列(一):從三種數據結構開始

    在Javascript中,有三種經常使用的數據結構是咱們必須瞭解的。它們分別是棧(stack)、堆(heap)、隊列(queue)。它們是咱們理解javascript核心的基礎。棧、堆、隊列對應不一樣的應用場景。
javascript

1.1  棧

    當咱們遇到棧的時候,可能會是不一樣的棧。什麼意思了?咱們先必須理清不一樣應用場景下的棧。java

    場景1:棧是一種數據結構,表示的是數據的一種存儲方式,這是一種理論基礎。數組

    場景2:棧是可用來規定代碼的執行順序,在javascript中叫作函數調用棧(call stack),他是根據棧數據結論理論的一種實踐。bash

    場景3:棧表達的是一種數據在內存中的存儲區域,一般叫作做棧區。可是javascript並無想別語言那樣區分棧區和堆區。所以這裏不作擴展。咱們能夠簡單粗暴的認爲在javascript中,全部的數據都是存放在堆內存空間中的。數據結構

    這裏須要咱們理解棧這種數據結構的原理和特色,學習它的最終目的是掌握函數調用棧的運行方式。下面咱們經過兵乓球盒這個案例來放便理解棧的存取方式。函數


    如圖所示,兵乓球盒中依次放入兵乓球,當咱們想取出兵乓球時,必須從頂部一個一個的拿出,直到取到咱們第一個放入的兵乓球。oop

    這種狀況與棧的數據結構一模一樣。這中存取方式能夠總結爲「先進後出,後進先出(LIFO,Last In,First Out)"。如圖中的,出於棧頂的true,最後進棧,最早出棧。1在棧底,最早進的棧,但只能最後出棧。學習

   在javascript中,數組(Array)提供了兩個棧方法來對應這種存取方式。spa

   push:向數組末尾添加元素(進棧方法)code

    push方法能夠接收任意參數,並把他們逐個添加到數組的末尾,並放回數組的長度。

var a = [];
a.push(1);            //a:[1]
a.push(2,3,4);        //a:[1,2,3,4]
var l = a.push(5)     //a:[1.2.3.4.5]     l:5複製代碼

    pop:彈出數組末尾的一個元素

    pop刪除數組末尾的一個元素,並返回。

var a = [1,2,3];
a.pop();    //a:[1,2]
a.pop()的返回結果爲3複製代碼

1.2  堆

堆數據是一種樹形結構

他的存取方式與從書架中取書類似。書齊地擺放在書架上,咱們只要清除咱們要在哪本書(知道書名)就能準確的找到咱們想要的書。咱們不用關係書的擺放順序,即不用想兵乓球盒那樣,必須將一些兵乓球取出來才能拿到咱們想拿到的。

由於GC的存在,因此JavaScript中沒法直接用堆的方式申請內存(相似的狀況在Java中也存在),可是咱們能夠參考JSON格式的數據,或者數組對象,咱們存儲的key-value能夠是無序的,由於順序的不一樣並不影響咱們的使用,咱們只須要關心書的名字。咱們操做的都棧的對象。

1.3  隊列

在javascript中,理解隊列數據結構的目的是爲了搞清楚事件循環(Event Loop)機制到底怎麼回事。以後的系列會講事件循環。

隊列(queue)是一種先進先出的(FIFO)數據結構。正如排隊過安檢同樣,排在隊伍前面的人必定是最早過安檢的人。原理如圖:


記住:兵乓球盒(棧)、書架取書(堆)、排隊進站(隊列)

相關文章
相關標籤/搜索