1. 程式人生 > 實用技巧 >前端中關於堆和棧的那些事

前端中關於堆和棧的那些事

前端中關於堆和棧的那些事

寫在前面:關於堆和棧,概念知道,但是該怎麼應用呢,我自己本身是第三遍才更加深刻的明白,第一遍是知道什麼是堆和棧,第二遍是在應用時懵逼了,第三遍是刷視訊和自己練習時有了醍醐灌頂的感覺。

  • 棧 記憶體:裡面的資料不能長期存在,一般存在執行的函式或者區域性變數(基本型別)

  • 堆 記憶體: 資料可以長期存放,一般存放物件。(引用型別)

    資料型別

    • 基本資料型別:(還是要宣告一點,佔用記憶體空間固定,儲存在棧中,儲存與複製的是值本身)
      1. string:字串,用於文字
      2. boolean:布林型別
      3. number:用於表示數值
      4. null :缺少的標識,指示變數未指向任何物件
      5. 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=[]就是重新得到了一個新的記憶體地址