前端中關於堆和棧的那些事
阿新 • • 發佈:2020-12-08
前端中關於堆和棧的那些事
寫在前面:關於堆和棧,概念知道,但是該怎麼應用呢,我自己本身是第三遍才更加深刻的明白,第一遍是知道什麼是堆和棧,第二遍是在應用時懵逼了,第三遍是刷視訊和自己練習時有了醍醐灌頂的感覺。
-
棧 記憶體:裡面的資料不能長期存在,一般存在執行的函式或者區域性變數(基本型別)
-
堆 記憶體: 資料可以長期存放,一般存放物件。(引用型別)
資料型別
- 基本資料型別:(還是要宣告一點,佔用記憶體空間固定,儲存在棧中,儲存與複製的是值本身)
- string:字串,用於文字
- boolean:布林型別
- number:用於表示數值
- null :缺少的標識,指示變數未指向任何物件
- underfined:任何一個只宣告未複製的變數
- 引用型別:物件,陣列,Data,...除了基本資料型別外
堆和棧的應用
- 堆:只要時引用型別的資料,複製和賦值的都是一個地址,資料指向的都是一個地址,地址裡面的資料變化之後,指向這個地址的資料都會變化
//判斷arr1 和 arr2是否一致 let arr1 = [1,2,3,4] let arr2 = arr1 arr2[2]=8 cinsole.log(arr1,arr2) // arr1,arr2都為[1,2,8,4]
-
棧:基本型別的資料都是存在棧中,儲存和複製的都是自己本身
let a = 1 let b = a b =2 console.log(a,b) a為1,b為2
練習時出錯的點
let arr1 = [1,2,3,4] let arr2 = arr1 arr2[2]=[1,3,3,4] cinsole.log(arr1,arr2) arr1 = [1,2,3,4]; arr2[2]=[1,3,3,4]
問題:按理說引用資料型別指標指向的是一個地址,會什麼有兩個不一樣的答案呢
分析發現:arr1指向的地址和arr2是不同的,所以是不同的資料,arr2 自己又重新引用了一個地址,一個數組,一個物件就是一個堆,arr2=[]就是重新得到了一個新的記憶體地址
- 基本資料型別:(還是要宣告一點,佔用記憶體空間固定,儲存在棧中,儲存與複製的是值本身)