內(nèi)存

1. 棧數(shù)據(jù)結(jié)構(gòu)

js中基本類型數(shù)據(jù)存放在棧結(jié)構(gòu)中
棧中存取數(shù)據(jù)的特點(diǎn)是先進(jìn)后出,后進(jìn)先出。如下圖:

棧.jpg

2. 堆數(shù)據(jù)結(jié)構(gòu)

js中引用類型數(shù)據(jù)存放在堆結(jié)構(gòu)中
堆樹結(jié)構(gòu)是一種樹狀結(jié)構(gòu),根據(jù)key可以獲取到對(duì)應(yīng)的value。

3. 隊(duì)列

隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),類似于排隊(duì)安檢。如下圖:


隊(duì)列.jpg

4. 基本數(shù)據(jù)類型和引用數(shù)據(jù)類型

js中有六種基本數(shù)據(jù)類型,undefined、null、boolean、number、string、symbol,基本數(shù)據(jù)類型都是按值訪問,我們可以直接操作存儲(chǔ)的保存在變量中的實(shí)際值。

引用類型數(shù)據(jù)存儲(chǔ)在堆內(nèi)存中,js不允許直接操作對(duì)象的堆內(nèi)存空間中的數(shù)據(jù),我們?cè)诓僮饕妙愋蛿?shù)據(jù)時(shí),實(shí)際上操作的是對(duì)象的引用而不是實(shí)際的值。所以,引用類型的值都是按引用地址訪問的。


堆&變量對(duì)象.jpg

上圖中反映出,我們要獲取對(duì)象數(shù)據(jù),首先需要獲取該對(duì)象的地址引用(地址指針),通過地址引用獲取到需要的數(shù)據(jù)。由于這一特性,我們?cè)谄綍r(shí)開發(fā)過程中就會(huì)遇到拷貝引用數(shù)據(jù)類型的問題。
在給引用類型數(shù)據(jù)賦值時(shí),其實(shí)就是把一個(gè)變量的地址指針給了另一個(gè)變量,所以這兩個(gè)變量的值其實(shí)還是同一個(gè),一個(gè)變量改變引起了另一個(gè)變量值的變化,由此產(chǎn)生數(shù)據(jù)污染問題(可見下圖)??捎蒙羁截悳\拷貝解決。詳情可參考http://www.itdecent.cn/p/bc4f8aa9534d

對(duì)象賦值.jpg

5. 內(nèi)存空間管理

js具有自動(dòng)垃圾收集回收機(jī)制,我們?cè)陂_發(fā)過程中不用太過于關(guān)注內(nèi)存使用問題。但是了解內(nèi)存機(jī)制有助于寫出性能更優(yōu)的代碼。

js內(nèi)存生命周期

  • 分配你所需要的內(nèi)存
  • 使用分配到的內(nèi)存(讀寫操作)
  • 不需要時(shí)將其釋放
    例如:
var a = 1; //分配空間
alert(a + 100); //使用內(nèi)存
a = null; //釋放內(nèi)存

垃圾回收機(jī)制的原理:找出不需要用到的值,釋放其占用的內(nèi)存。垃圾回收器會(huì)每隔固定的時(shí)間段就執(zhí)行一次釋放操作。最常用的時(shí)通過標(biāo)記清除的算法來找出哪些變量不需要繼續(xù)使用,因此, a=null就是一個(gè)釋放內(nèi)存的操作。這個(gè)值會(huì)在下一次垃圾收集器執(zhí)行操作時(shí)被找到并且釋放。局部作用域中,垃圾回收器很好判斷并回收。全局變量很難判斷,開發(fā)過程中,盡可能少的使用全局變量。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容