陣列中堆疊和引用型別的問題

2021-07-16 08:47:01 字數 951 閱讀 9315

1、棧(stack)和堆(heap)

stack為自動分配的記憶體空間,它由系統自動釋放;而heap則是動態分配的記憶體,大小不定也不會自動釋放。

2、基本型別和引用型別

(1) 基本型別 :存放在棧記憶體中的簡單資料段,資料大小確定,記憶體空間大小可以分配。

5種基本資料型別有undefined、null、boolean、number 和 string,它們是直接按值存放的,所以可以直接訪問。

(2) 引用型別 :存放在堆記憶體中的物件,變數實際儲存的是乙個指標,這個指標指向另乙個位置。每個空間大小不一樣,要根據情況開進行特定的分配。

當我們需要訪問引用型別(如物件,陣列,函式等)的值時,首先從棧中獲得該物件的位址指標,然後再從堆記憶體中取得所需的資料。

3、傳值與傳址

基本型別與引用型別最大的區別實際就是傳值與傳址的區別。測試用例:

var a = [1,2,3,4,5];

var b = a;

var c = a[0];

alert(b);//1,2,3,4,5

alert(c);//1

//改變量值

b[4] = 6;

c = 7;

alert(a[4]);//6

alert(a[0]);//1

從上面我們可以得知,當我改變b中的資料時,a中資料也發生了變化;但是當我改變c的資料值時,a卻沒有發生改變。這就是傳值與傳址的區別。因為a是陣列,屬於引用型別,所以它賦予給b的時候傳的是棧中的位址(相當於新建了乙個不同名「指標」),而不是堆記憶體中的物件。而c僅僅是從a堆記憶體中獲取的乙個資料值,並儲存在棧中。所以b修改的時候,會根據位址回到a堆中修改,c則直接在棧中修改,並且不能指向a堆記憶體中。

C 中的值型別和引用型別以及堆疊

引用型別如 string,object,class等總是在從託管堆上分配的,c 中new操作符返回物件的記憶體位址 也就是指向物件資料的記憶體位址。以下是值型別與引用型別的表 我們來看下面一段 首先在類中宣告乙個class類,和乙個struct結構,如圖 並使用在程式入口呼叫它們,如圖 現在我們來看...

C 值型別和引用型別在記憶體中的儲存(堆疊)

前言 值型別和引用型別都是用來儲存資料的 值型別存資料,引用型別存引用 但是這兩種型別本身又需要儲存在記憶體中。堆疊出現的原因 在程式執行中,為了提高程式的執行效率,就分出了一大一小兩塊區域來分別儲存不同型別的資料,分別是堆和棧 區域小的棧,讀取速度相對較快,區域大的堆,讀取速度相對較慢。概念 資料...

陣列(引用型別)複製問題

陣列賦值問題涉及到拷貝 堆疊空間 基本資料型別和引用資料型別的差異。自行了解 var arra 1,2,3,4,5 var arrb arra 把b陣列值重置成0 arrb.fill 0 console.log arra console.log arrb 輸出結果是 arra 0,0,0,0,0 a...