JavaScript數(shù)據(jù)類型的存儲方法詳解
一個很基礎的知識點,JavaScript中基本數(shù)據(jù)類型和引用數(shù)據(jù)類型是如何存儲的。
由于自己是野生程序員,在剛開始學習程序設計的時候沒有在意內(nèi)存這些基礎知識,導致后來在提到“什么什么是存在棧中的,棧中只是存了一個引用”這樣的話時總是一臉懵逼。。
后來漸漸的了解了一些內(nèi)存的知識,這部分還是非常有必要了解的。
基本數(shù)據(jù)結構
棧
棧,只允許在一段進行插入或者刪除操作的線性表,是一種先進后出的數(shù)據(jù)結構。
堆
堆是基于散列算法的數(shù)據(jù)結構。
隊列
隊列是一種先進先出(FIFO)的數(shù)據(jù)結構。
JavaScript中數(shù)據(jù)類型的存儲
JavaScript中將數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,它們其中有一個區(qū)別就是存儲的位置不同。
基本數(shù)據(jù)類型
我們都知道JavaScript中的基本數(shù)據(jù)類型有:
- String
- Number
- Boolean
- Undefined
- Null
- Symbol(暫時不管)
基本數(shù)據(jù)類型都是一些簡單的數(shù)據(jù)段,它們是存儲在棧內(nèi)存中。
引用數(shù)據(jù)類型
JavaScript中的引用數(shù)據(jù)類型有:
- Array
- Object
引用數(shù)據(jù)類型是保存在堆內(nèi)存中的,然后再棧內(nèi)存中保存一個對堆內(nèi)存中實際對象的引用。所以,JavaScript中對引用數(shù)據(jù)類型的操作都是操作對象的引用而不是實際的對象。
可以理解為,棧內(nèi)存中保存了一個地址,這個地址和堆內(nèi)存中的實際值是相關的。
圖解
現(xiàn)在,我們聲明幾個變量試試:
var name="axuebin";
var age=25;
var job;
var arr=[1,2,3];
var obj={age:25};
可以通過下圖來表示數(shù)據(jù)類型在內(nèi)存中的存儲情況:

此時 name , age , job 三種基本數(shù)據(jù)類型是直接存在棧內(nèi)存中的,而 arr , obj 在棧內(nèi)存中只是存了一個地址來表示對堆內(nèi)存中的引用。
復制
基本數(shù)據(jù)類型
對于基本數(shù)據(jù)類型,如果進行復制,系統(tǒng)會自動為新的變量在棧內(nèi)存中分配一個新值,很容易理解。
引用數(shù)據(jù)類型
如果對于數(shù)組、對象這樣的引用數(shù)據(jù)類型而言,復制的時候就會有所區(qū)別了:
系統(tǒng)也會自動為新的變量在棧內(nèi)存中分配一個值,但這個值僅僅是一個地址。也就是說,復制出來的變量和原有的變量具有相同的地址值,指向堆內(nèi)存中的同一個對象。

如果所示,執(zhí)行了 var objCopy=obj 之后, obj 和 objCopy 具有相同的地址值,執(zhí)行堆內(nèi)存中的同一個實際對象。
這有什么不同呢?
當我修改 obj 或 objCopy 時,都會引起另一個變量的改變。
為什么?
為什么基礎數(shù)據(jù)類型存在棧中,而引用數(shù)據(jù)類型存在堆中呢?
- 堆比棧大,棧比對速度快。
- 基礎數(shù)據(jù)類型比較穩(wěn)定,而且相對來說占用的內(nèi)存小。
- 引用數(shù)據(jù)類型大小是動態(tài)的,而且是無限的。
- 堆內(nèi)存是無序存儲,可以根據(jù)引用直接獲取。
總結
以上所述是小編給大家介紹的JavaScript數(shù)據(jù)類型的存儲方法詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
javascript中強制執(zhí)行toString()具體實現(xiàn)
Javascript通常會根據(jù)方法或運算符的需要而自動把值轉成所需的類型,這可能導致各種錯誤,接下來為大家介紹下javascript如何強制執(zhí)行toString(),感興趣的朋友可以參考下哈2013-04-04
妙用Bootstrap的 popover插件實現(xiàn)校驗表單提示功能
最近使用bootstrap開發(fā)項目比較多,在表單校驗功能中用popover插件實現(xiàn)出錯提示功能很方面,下面小編給大家?guī)砹艘黄P于Bootstrap的 popover插件實現(xiàn)校驗表單提示功能的實現(xiàn)代碼,非常不錯,感興趣的朋友一起看看吧2016-08-08
JavaScript使用AOP編程思想實現(xiàn)監(jiān)聽HTTP請求
這篇文章主要為大家詳細介紹了如何在JavaScript使用AOP編程思想實現(xiàn)監(jiān)聽HTTP請求,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-02-02
webpack結合express實現(xiàn)自動刷新的方法
這篇文章主要給大家介紹了關于webpack結合express實現(xiàn)自動刷新的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用webpack具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-05-05

