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

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

如果所示,執(zhí)行了 var objCopy=obj 之后, obj 和 objCopy 具有相同的地址值,執(zhí)行堆內(nèi)存中的同一個(gè)實(shí)際對(duì)象。
這有什么不同呢?
當(dāng)我修改 obj 或 objCopy 時(shí),都會(huì)引起另一個(gè)變量的改變。
為什么?
為什么基礎(chǔ)數(shù)據(jù)類型存在棧中,而引用數(shù)據(jù)類型存在堆中呢?
- 堆比棧大,棧比對(duì)速度快。
- 基礎(chǔ)數(shù)據(jù)類型比較穩(wěn)定,而且相對(duì)來說占用的內(nèi)存小。
- 引用數(shù)據(jù)類型大小是動(dòng)態(tài)的,而且是無限的。
- 堆內(nèi)存是無序存儲(chǔ),可以根據(jù)引用直接獲取。
總結(jié)
以上所述是小編給大家介紹的JavaScript數(shù)據(jù)類型的存儲(chǔ)方法詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 瀏覽器中url存儲(chǔ)的JavaScript實(shí)現(xiàn)
- js瀏覽器本地存儲(chǔ)store.js介紹及應(yīng)用
- 分享8個(gè)JavaScript庫(kù)可更好地處理本地存儲(chǔ)
- JS localStorage存儲(chǔ)對(duì)象,sessionStorage存儲(chǔ)數(shù)組對(duì)象操作示例
- JS+HTML5本地存儲(chǔ)Localstorage實(shí)現(xiàn)注冊(cè)登錄及驗(yàn)證功能示例
- 基于js 本地存儲(chǔ)(詳解)
- JavaScript數(shù)據(jù)存儲(chǔ) Cookie篇
- 總結(jié)JavaScript三種數(shù)據(jù)存儲(chǔ)方式之間的區(qū)別
- 詳解JS瀏覽器儲(chǔ)存
相關(guān)文章
js實(shí)現(xiàn)用戶注冊(cè)協(xié)議倒計(jì)時(shí)的方法
這篇文章主要介紹了js實(shí)現(xiàn)用戶注冊(cè)協(xié)議倒計(jì)時(shí)的方法,是開發(fā)會(huì)員注冊(cè)功能時(shí)非常實(shí)用的技巧,需要的朋友可以參考下2015-01-01
var?let?const關(guān)鍵字之間的區(qū)別及使用場(chǎng)景示例詳解
這篇文章主要為大家介紹了var?let?const關(guān)鍵字之間的區(qū)別及使用場(chǎng)景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Bootstrap 手風(fēng)琴菜單的實(shí)現(xiàn)代碼
這篇文章主要介紹了Bootstrap 手風(fēng)琴菜單的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-01-01
基于JS實(shí)現(xiàn)回到頁面頂部的五種寫法(從實(shí)現(xiàn)到增強(qiáng))
這篇文章主要介紹了基于JS實(shí)現(xiàn)回到頁面頂部的五種寫法(從實(shí)現(xiàn)到增強(qiáng))的相關(guān)資料,本文介紹的非常詳細(xì),實(shí)用性也非常高,非常具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
基于javascript實(shí)現(xiàn)根據(jù)身份證號(hào)碼識(shí)別性別和年齡
這篇文章主要介紹了基于javascript實(shí)現(xiàn)根據(jù)身份證號(hào)碼識(shí)別性別和年齡的相關(guān)資料,需要的朋友可以參考下2016-01-01
JavaScript實(shí)現(xiàn)五種不同煙花特效
這篇文章主要給大家?guī)砦鍌€(gè)好看的基于 HTML+CSS+JS 的煙花特效,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)JavaScript有一定的幫助,需要的可以參考一下2022-01-01
在javaScript中檢測(cè)數(shù)據(jù)類型的幾種方式小結(jié)
在用javaScript編程的過程中,我們經(jīng)常會(huì)遇到這樣一個(gè)問題,就是需要檢測(cè)一個(gè)數(shù)據(jù)或變量的類型,本篇文章主要介紹了在javaScript中檢測(cè)數(shù)據(jù)類型的幾種方式小結(jié),有興趣的可以了解一下。2017-03-03

