一谈截、??堆(heap)和棧(stack)
棧(stack)會(huì)自動(dòng)分配內(nèi)存空間台舱,會(huì)自動(dòng)釋放。堆(heap)動(dòng)態(tài)分配的內(nèi)存第岖,大小不定也不會(huì)自動(dòng)釋放
二难菌、數(shù)據(jù)類型
1、基本類型(簡(jiǎn)單的數(shù)據(jù)段蔑滓,存放在棧里面郊酒,占固定大小的空間)
基本類型有:Undefined遇绞、Null、Boolean燎窘、Number 和String摹闽。這些類型在內(nèi)存中分別占有固定大小的空間,他們的值保存在椇纸。空間付鹿,我們通過(guò)按值來(lái)訪問(wèn)的。
2蚜迅、引用類型(多個(gè)值構(gòu)成的對(duì)象舵匾,保存在堆內(nèi)存中,包含引用類型的變量實(shí)際上保存的不是變量本身谁不,而是指向該對(duì)象的指針)
引用類型坐梯,值大小不固定,棧內(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)查詢引用類型的變量時(shí)砍濒, 先從棧中讀取內(nèi)存地址, 然后再通過(guò)地址找到堆中的值硫麻。對(duì)于這種爸邢,我們把它叫做按引用訪問(wèn)。
三拿愧、數(shù)據(jù)銷毀
基本數(shù)據(jù)類型在當(dāng)前執(zhí)行環(huán)境結(jié)束時(shí)銷毀杠河,而引用類型不會(huì)隨執(zhí)行環(huán)境結(jié)束而銷毀,只有當(dāng)所有引用他的變量不存在時(shí)這個(gè)對(duì)象才會(huì)被回收機(jī)制回收浇辜。
四券敌、引用類型最好不要比較
舉個(gè)栗子:
var a={name:"ayi",age:21};//初始化一個(gè)對(duì)象(引用類型)
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)在的测蹲,所以兩次是一樣的莹捡。
//想要他們的引用地址不一樣,可以使用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))套用