一、??堆(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))套用