JavaScript共有八種數據類型,分別是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。
其中 Symbol 和 BigInt 是ES6 中新增的數據類型:
Symbol 代表創建后獨一無二且不可變的數據類型,它主要是為了解決可能出現的全局變量沖突的問題。BigInt 是一種數字類型的數據,它可以表示任意精度格式的整數,使用 BigInt 可以安全地存儲和操作大整數,即使這個數已經超出了 Number 能夠表示的安全整數范圍。
這些數據可以分為原始數據類型和引用數據類型:
棧:原始數據類型(Undefined、Null、Boolean、Number、String)堆:引用數據類型(對象、數組和函數)
兩種類型的區別在于存儲位置的不同:
原始數據類型直接存儲在棧(stack)中的簡單數據段,占據空間小、大小固定,屬于被頻繁使用數據,所以放入棧中存儲;引用數據類型存儲在堆(heap)中的對象,占據空間大、大小不固定。如果存儲在棧中,將會影響程序運行的性能;引用數據類型在棧中存儲了指針,該指針指向堆中該實體的起始地址。當解釋器尋找引用值時,會首先檢索其在棧中的地址,取得地址后從堆中獲得實體。
堆和棧的概念存在于數據結構和操作系統內存中,在數據結構中:
在數據結構中,棧中數據的存取方式為先進后出。堆是一個優先隊列,是按優先級來進行排序的,優先級可以按照大小來規定。
在操作系統中,內存被分為棧區和堆區:
棧區內存由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。堆區內存一般由開發著分配釋放,若開發者不釋放,程序結束時可能由垃圾回收機制回收。