學過計算機的童鞋們都知道棧和堆,說實話大學的時候真沒好好聽講,也就知道個大概,今天就簡單的總結一下,淺談棧和堆,去了解一下我們平時定義變量的時候,在計算機中是怎麼存儲的。前端
堆和棧實際上是兩種數據結構。堆棧都是一種數據項按序排列的數據結構,只能在一端(稱爲棧頂(top))對數據項進行插入和刪除。堆棧是個特殊的存儲區,主要功能是暫時存放數據和地址。
程序員
話很少說,我們先上一段簡單的代碼,本身去思考一下會打印出什麼結果而且爲何會打印這種結果?,在堆和棧中怎麼呈現的?,在看下面對應的解釋,這樣的話可能就更好的理解了。數組
//1
var a = 10;
b = a;
b += 20;
alert(a);
//2
var obj = {
name : "jack"
};
b = obj;
b.name = "Lily";
alert( obj.name );
//3
var arr = [1,2,3];
brr = arr;
brr[0] = 10;
alert( arr[0] );
//4
var a = 20;
function fun(a){
a += 30;
}
fun( a );
alert( a );
//5
var arr = [1,2,3];
function fun(brr){
brr[0] = 20;
}
fun(arr);
alert(arr[0]);
複製代碼
上圖:bash
對着這張圖就能夠理解第一道題爲何會打印10了,當你聲明一個變量,計算機會在棧中給你開闢一個內存空間去存儲這個變量,當你去改變b的時候,那也只是去改變了b,因此a空間的值是不會受到任何影響,因此第一道題會打印出來10。數據結構
繼續上圖:函數
上面說了棧中存儲的是基本類型的數據,若是是數組,對象等這些呢?上面這個圖就能看出來,對應着第三道題看,若是定義一個arr = [1,2,3]。在棧中就會存儲一個地址,在堆中就會存儲對應地址的值,這個地址就會指向對應的數據,那這個地址在計算機中叫什麼呢?其實就是所謂的指針變量, brr = arr; 叫作地址傳值,你會發現brr在堆中是指向同一個位置,從而當你改變brr[0]的時候,arr[0]也是跟着改變了,因此第三那道題的答案也就出來了,再也不是1而是10;因此這種地址傳值也就稱其爲一改全改。post
上面提到的一改全改不知道你在真正開發的時候想到的了什麼,那就是深拷貝和淺拷貝的問題,在開發中會常常遇到這種問題,關於拷貝你能夠看看個人這篇文章,<--點這裏。spa
以上講解自我感受通俗易懂,沒有太多華麗的語言,看的舒服看得懂纔是最重要的,若是你是作前端的,若是你是非計算機專業半道出家的我相信也是對你有多幫助的,固然還有更專業的講解。剩下得幾道題能夠本身去對着思考思考了,若是能幫到你更好的理解關於堆和棧,請給我一個小小的贊做爲鼓勵,我會更努力的寫文章。操作系統