JavaScript 值型別和引用型別在堆疊中的存放

antzone發表於2017-05-19

本章節介紹一下JavaScript的值型別和引用型別資料是如何在堆疊中存放的。

其實並不僅僅JavaScript這樣,其他語言也大致如此。

一.JavaScript中的資料型別:

資料型別總體可以分為兩類:

(1).值型別

(2).引用型別

可能不同的文章,名稱上有所區別,其實都是一回事。

(1).值型別資料有:string、number、boolean、symbol(ES6新增)、null、undefined。

(2).引用型別資料有:物件和函式。

更多內容可以參閱JavaScript 資料型別一章節。

二.棧和堆簡單介紹:

棧是一種先進後出的資料結構,我們可以通過陣列進行以下模擬。

程式碼如下:

[JavaScript] 純文字檢視 複製程式碼
var arr = []; //建立一個棧
arr.push("one");//壓入元素"one" ["one"]
arr.push("two");//壓入元素"two"   ["one","two"]
arr.pop();//彈出"two"
arr.push("three");//壓入元素"three"   ["one","three"]

上面的相關方法可以參閱一下兩篇文章:

(1).JavaScript push()一章節。

(2).JavaScript pop()一章節。

與上面程式碼對應的圖示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/29/092047j9q6vqq54nnmnq94.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

值型別是儲存在棧中的簡單欄位,它們直接儲存在變數的訪問位置。

堆是存放資料的基於雜湊演算法的資料結構,引用型別資料就存放在堆中。

引用型別資料的實際值儲存在堆中,棧中的變數只是儲存的一個指向堆的地址。

看如下程式碼例項:

[JavaScript] 純文字檢視 複製程式碼
var obj = new Object();

下面就對上面的程式碼做一下解釋:

變數obj在棧中,它儲存的是一個地址,這個地址是指向物件new Object()。

物件new Object()儲存在堆中。

三.存放資料為什麼要區分棧和堆:

什麼東西都要講究一個平衡,棧的儲存量比較小,但是速度快。堆則恰好相反。

因為值型別資料比較簡單,確定一個資料就確定了它的大小,所以適合儲存在棧中。

但是引用型別資料可以無限的擴充套件,幾乎是任意的修改,所以適合儲存在堆中。

相關文章