1. 程式人生 > >Javascript中的陣列在記憶體中是如何儲存的?

Javascript中的陣列在記憶體中是如何儲存的?

大家在日常編碼中,最長碰到的是陣列和物件的操作,各種增刪改查,但是你真的瞭解陣列和物件麼?陣列的最基本概念就不解釋了,詳情看MDN文件——陣列 今天我們主要講一下陣列的記憶體模型。

陣列的記憶體模型

Javascript的記憶體分為堆記憶體和棧記憶體,陣列作為物件,在建立後儲存在堆記憶體中。 任何計算機語言記憶體的分配都要經歷三個階段

  • 分配記憶體
  • 對記憶體進行讀、寫
  • 釋放記憶體(垃圾回收)

本文主要針對陣列的記憶體分配進行解釋。 Javascript中陣列有幾個不同於其他語言陣列的特點

  • 陣列中可以存放不同的資料結構,可以存放陣列、物件、Number、Undefined、Null、String、Symbol、Boolean、Function等等。
  • 陣列的index是字串型別的,之所以你可以通過arr[1],獲得對應的資料,是因為Javascript自動將數字轉化為字串。

陣列本來應該是一個連續的記憶體分配,但是在Javascript中不是連續分配的,而是類似雜湊對映的方式存在的。 對於上述的實現方式,熟悉資料結構的同學應該知道,對於讀取操作,雜湊表的效率並不高,而修改刪除的效率比較高。 現在瀏覽器為了優化其操作,對陣列的建立時候的記憶體分配進行了優化:

  • 對於同構的陣列,也就是,陣列中元素型別一致,會建立連續的記憶體分配
  • 對於不同構陣列,按照原來的方式建立。
  • 如果你想插入一個異構資料,那麼就會重新解構,通過雜湊對映的方式建立

為了進一步優化功能的實現,Javascript中出現了

ArrayBuffer,它可以建立連續的記憶體供程式設計人員使用。

  • ArrayBuffer是建立一塊連續的記憶體,不能直接操作
  • 通過檢視對分配的記憶體進行讀寫操作

顯而易見,如果通過ArrayBuffer建立的陣列進行遍歷操作,速度更快。 參考文章: 陣列深度解析