關(guān)于JS的堆和棧的理解

一、??堆(heap)和棧(stack)

棧(stack)會(huì)自動(dòng)分配內(nèi)存空間,會(huì)自動(dòng)釋放。堆(heap)動(dòng)態(tài)分配的內(nèi)存,大小不定也不會(huì)自動(dòng)釋放

二、數(shù)據(jù)類(lèi)型

1、基本類(lèi)型(簡(jiǎn)單的數(shù)據(jù)段,存放在棧里面,占固定大小的空間)

基本類(lèi)型有:Undefined、Null、Boolean、Number 和String。這些類(lèi)型在內(nèi)存中分別占有固定大小的空間,他們的值保存在棧空間,我們通過(guò)按值來(lái)訪問(wèn)的。

2、引用類(lèi)型(多個(gè)值構(gòu)成的對(duì)象,保存在堆內(nèi)存中,包含引用類(lèi)型的變量實(shí)際上保存的不是變量本身,而是指向該對(duì)象的指針)

引用類(lèi)型,值大小不固定,棧內(nèi)存中存放地址指向堆內(nèi)存中的對(duì)象。是按引用訪問(wèn)的。棧內(nèi)存中存放的只是該對(duì)象的訪問(wèn)地址,在堆內(nèi)存中為這個(gè)值分配空間。由于這種值的大小不固定,因此不能把它們保存到棧內(nèi)存中。但內(nèi)存地址大小的固定的,因此可以將內(nèi)存地址保存在棧內(nèi)存中。 這樣,當(dāng)查詢(xún)引用類(lèi)型的變量時(shí), 先從棧中讀取內(nèi)存地址, 然后再通過(guò)地址找到堆中的值。對(duì)于這種,我們把它叫做按引用訪問(wèn)。

三、數(shù)據(jù)銷(xiāo)毀

基本數(shù)據(jù)類(lèi)型在當(dāng)前執(zhí)行環(huán)境結(jié)束時(shí)銷(xiāo)毀,而引用類(lèi)型不會(huì)隨執(zhí)行環(huán)境結(jié)束而銷(xiāo)毀,只有當(dāng)所有引用他的變量不存在時(shí)這個(gè)對(duì)象才會(huì)被回收機(jī)制回收。

四、引用類(lèi)型最好不要比較

舉個(gè)栗子:

var a={name:"ayi",age:21};//初始化一個(gè)對(duì)象(引用類(lèi)型)

var obj1=a,obj2=a;//將obj1和obj2指向同一個(gè)地址,都為a的地址

obj1.name="aha";//改變obj1的name的值,這個(gè)時(shí)候obj1的地址并沒(méi)有變化

console.log(obj1==obj2)//這個(gè)時(shí)候打印的值為true,因?yàn)樗麄冞€是指向同一地址引用。

obj1={name:"aiyo"};//這個(gè)時(shí)候obj1指向了另外一個(gè)地址引用

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

五、項(xiàng)目中遇到的問(wèn)題

···

? var arry1=[

{name:"zhang",age:23,key:"12"},

? ? ? ? {name:"as",age:23,key:"123"},

? ? ? ? {name:"sd",age:23,key:"124"},

? ? ? ? {name:"df",age:23,key:"125"},

? ? ? ? {name:"fd",age:23,key:"126"},

? ? ? ? {name:"as",age:23,key:"127"},

? ? ? ? {name:"as",age:23,key:"1276"},

? ? ? ? {name:"as",age:23,key:"533"}];

? ? var item={name:"as",age:23};

? ? function btnClick() {

// var _item=JSON.parse(JSON.stringify(item))

? ? ? ? var _item=item;

? ? ? ? for(var i=0;i

if(_item.name==arry1[i].name){

_item.key=arry1[i].key+"1"http://item本來(lái)沒(méi)有key,現(xiàn)在使得他的key的地址指向arry1[i].key+"1"

//第二次單擊時(shí),改變item.key的地址,之前push到arry1的item.key的地址也變成現(xiàn)在的,所以?xún)纱问且粯拥摹?/p>

//想要他們的引用地址不一樣,可以使用JSON.parse(JSON.stringify(value))套用

? ? ? ? ? ? }

}

arry1.push(_item)

console.log(arry1)//單擊兩次以后,發(fā)現(xiàn)打印出來(lái)最后兩個(gè)元素的key值是一樣的

? ? }

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容