1 棧 stack”和“堆 heap”
簡單的來講翻具,stack上分配的內(nèi)存系統(tǒng)自動釋放,heap上分配的內(nèi)存回还,系統(tǒng)不釋放裆泳,哪怕程序退出,那一塊內(nèi)存還是在那里柠硕。stack一般是靜態(tài)分配內(nèi)存工禾,heap上一般是動態(tài)分配內(nèi)存。
2 基本類型和引用類型
基本類型:存放在棧內(nèi)存中的簡單數(shù)據(jù)段蝗柔。數(shù)據(jù)大小確定闻葵,內(nèi)存空間大小可以分配。
6種基本數(shù)據(jù)類型有Undefined癣丧、Null槽畔、Boolean、Number胁编、String厢钧、Symbol(ECMAScript 6新增)它們是直接按值存放的,所以可以直接訪問嬉橙。
var num1 = 5;
var num2 = num1;
執(zhí)行內(nèi)存變化:
基本類型的復(fù)制就是在棧內(nèi)存中開辟出了一個新的存儲區(qū)域用來存儲新的變量早直,這個變量有它自己的值,只不過和前面的值一樣市框,所以如果其中一個的值改變霞扬,則不會影響到另一個。
引用類型:存放在堆內(nèi)存中的對象枫振,變量中實際保存的是一個指針祥得,這個指針指向另一個位置。每個空間大小不一樣蒋得,要根據(jù)情況開進行特定的分配。
當我們需要訪問引用類型(如對象乒疏,數(shù)組额衙,函數(shù)等)的值時,首先從棧中獲得該對象的地址指針怕吴,然后再從堆內(nèi)存中取得所需的數(shù)據(jù)窍侧。
var object1 = new Object();
var object2 = object1;
console.log(object1 == object2);//輸出結(jié)果為:true
object1.name = 'hello';
console.log(object2.name);//輸出結(jié)果為:hello
執(zhí)行內(nèi)存變化:
引用類型定義了一個對象其實是在棧內(nèi)存中存儲了一個指針转绷,這個指針指向堆內(nèi)存中該對象的存儲地址伟件。復(fù)制給另一個對象的過程其實是把該對象的地址復(fù)制給了另一個對象變量,兩個指針都指向同一個對象议经,所以若其中一個修改了斧账,則另一個也會改變谴返。
3 基本類型的數(shù)據(jù)是沒有屬性和方法的,引用類型才會有咧织,但是為什么String類型卻又那么多方法呢嗓袱?
var string = "aaa";
var string2 = string.substring(0));//aaa
基本類型的確沒有方法和屬性,因為一旦創(chuàng)建了屬性或者方法就會被立刻銷毀习绢,但是為了方便程序員對這類的基本類型數(shù)據(jù)比較方便的操作渠抹,在底層做了一些工作,其實這段代碼相當于:
var string =new String("aaa");
var string2 = string.substring(0);
string=null;
(1)創(chuàng)建一個String類型的實例(使用new操作符創(chuàng)建的引用類型的實例闪萄,在執(zhí)行流離開當前作用域之前都一直保存在內(nèi)存中梧却。而自動創(chuàng)建的基本包裝類型的對象,則只存在于一
行代碼的執(zhí)行瞬間败去,然后立即被銷毀 )
(2)在實例上調(diào)用指定方法
(3)銷毀該實例
經(jīng)過這三步放航,字符串值就變得和對象一樣了,在Boolean ?Number中也是這樣为迈。String ?Boolean ?Number 這三種類型也叫做 ?基本包裝類型