JS的堆 棧,資料賦值

2021-08-22 13:34:36 字數 1301 閱讀 7732

一、 堆(heap)和棧(stack)

棧(stack)會自動分配記憶體空間,會自動釋放。堆(heap)動態分配的記憶體,大小不定也不會自動釋放

二、資料型別

1、基本型別(簡單的資料段,存放在棧裡面,佔固定大小的空間)

基本型別有:undefined、null、boolean、number 和string。這些型別在記憶體中分別占有固定大小的空間,他們的值儲存在棧空間,我們通過按值來訪問的。

2、引用型別(多個值構成的物件,儲存在堆記憶體中,包含引用型別的變數實際上儲存的不是變數本身,而是指向該物件的指標)

引用型別,值大小不固定,棧記憶體中存放位址指向堆記憶體中的物件。是按引用訪問的。棧記憶體中存放的只是該物件的訪問位址,在堆記憶體中為這個值分配空間。由於這種值的大小不固定,因此不能把它們儲存到棧記憶體中。但記憶體位址大小的固定的,因此可以將記憶體位址儲存在棧記憶體中。 這樣,當查詢引用型別的變數時, 先從棧中讀取記憶體位址, 然後再通過位址找到堆中的值。對於這種,我們把它叫做按引用訪問。

三、資料銷毀

基本資料型別在當前執行環境結束時銷毀,而引用型別不會隨執行環境結束而銷毀,只有當所有引用他的變數不存在時這個物件才會被**機制**。

四、引用型別最好不要比較

舉個栗子:

var a=;//初始化乙個物件(引用型別)

var obj1=a,obj2=a

;//將obj1和obj2指向同乙個位址,都為a的位址

obj1.name="aha"

;//改變obj1的name的值,這個時候obj1的位址並沒有變化

console.log(obj1==obj2)//這個時候列印的值為true,因為他們還是指向同一位址引用。

obj1=;//這個時候obj1指向了另外乙個位址引用

console.log(obj1==obj2)//false

五、專案中遇到的問題

var arry1=[,,,

,,,,

];var item=;

function btnclick()

}arry1.push(_item)

console.log(arry1)//單擊兩次以後,發現列印出來最後兩個元素的key值是一樣的

}

在賦值的時候,其實改變的是引用位址,想要改變他的位址以及值,可以使用json.parse(json.stringify(value))套用

js堆疊問題

在日常開發中常有這樣乙個需求 初始化多個變數為預設值,如下 let defaultval 0 var numone defaultval var numtwo defaultval numone 2 numtwo 5 console.log numone,numtwo 結果2,5 對於上面這個 兩個...

js的結構賦值

var foo one two three var one,two,three foo console.log one one console.log two two console.log three three var a,b a,b 1,2 console.log a 1 console.lo...

JS中的堆疊記憶體

棧記憶體俗稱作用域 全域性作用域 只有乙個,即window 和私有作用域。作用 為js 提供執行的環境 執行js 的地方 基本資料型別是直接存放在棧記憶體中的。堆記憶體用於儲存引用資料型別值的 相當於儲存的倉庫 物件儲存的是鍵值對。函式儲存的是 字串。堆記憶體利用空物件指標null來釋放空間。var...