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

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ì)安檢。如下圖:

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ì)象數(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。

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ā)過程中,盡可能少的使用全局變量。