字符串餐胀、數(shù)字哟楷、布爾、數(shù)組否灾、對(duì)象卖擅、Null、Undefined
數(shù)據(jù)類型
1.? ECMAScript變量包含兩種不同類型的值:基本類型值、引用類型值惩阶;
2.?? 基本類型值:指的是保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段挎狸;
3.?? 引用類型值:指的是那些保存在堆內(nèi)存中的對(duì)象,意思是断楷,變量中保存的實(shí)際上只是一個(gè)指針锨匆,這個(gè)指針指向內(nèi)存堆中實(shí)際的值沦零;
兩種訪問(wèn)方式
1.? 基本類型值:按值訪問(wèn)价认,操作的是他們實(shí)際保存的值褪那;
2.? 引用類型值:按引用訪問(wèn)炼鞠,當(dāng)查詢時(shí)桩撮,我們需要先從棧中讀取內(nèi)存地址垂谢,然后再順藤摸瓜地找到保存在堆內(nèi)存中的值荸哟;
兩種類型復(fù)制
1儡炼、基本類型變量的復(fù)制:
從一個(gè)變量向一個(gè)變量復(fù)制時(shí)响牛,會(huì)在棧中創(chuàng)建一個(gè)新值鞭衩,然后把值復(fù)制到為新變量分配的位置上,改變?cè)磾?shù)據(jù)不會(huì)影響到新的變量(互不干涉)娃善;
2论衍、引用類型變量的復(fù)制:
復(fù)制的是存儲(chǔ)在棧中的指針,將指針復(fù)制到棧中未新變量分配的空間中聚磺,而這個(gè)指針副本和原指針執(zhí)行存儲(chǔ)在堆中的同一個(gè)對(duì)象坯台,復(fù)制操作結(jié)束后,兩個(gè)變量實(shí)際上將引用同一個(gè)對(duì)象瘫寝;因此改變其中的一個(gè)蜒蕾,將影響另一個(gè);
函數(shù)參數(shù)的傳遞
1.? ECMA中所有函數(shù)的參數(shù)都是按值傳遞的焕阿;
在向參數(shù)傳遞基本類型的值時(shí)咪啡,被傳遞的值會(huì)被復(fù)制給一個(gè)局部變量,在向參數(shù)傳遞引用類型的值時(shí)暮屡,會(huì)把這個(gè)值在內(nèi)存的地址復(fù)制給一個(gè)局部變量
基本數(shù)據(jù)類型傳遞參數(shù)
funciton addTen(num){
num+=10;
return num;
}
var count=20;
var result=addTen(count);
alert(count);//20
alert(resullt);//30
執(zhí)行結(jié)果是:20和30撤摸。在這段代碼中,將變量count當(dāng)做參數(shù)傳遞給了函數(shù)addTen褒纲,也就是相當(dāng)于將變量count的值復(fù)制給了函數(shù)addTen的參數(shù)准夷。這時(shí)addTen的參數(shù)num可以看做是函數(shù)內(nèi)部的一個(gè)變量。在上段代碼中莺掠,就相當(dāng)于兩個(gè)基本數(shù)據(jù)類型變量之間的值復(fù)制衫嵌。而基本數(shù)據(jù)類型都有自己獨(dú)立的內(nèi)存地址,所以num和count是沒(méi)有任何關(guān)系的彻秆,他們只是值相等而已楔绞,函數(shù)執(zhí)行完畢后结闸,count的值并沒(méi)有改變。而函數(shù)外面的result是被直接賦值的酒朵,所以result的值就是函數(shù)的結(jié)果30桦锄。
引用類型傳遞參數(shù)
function setName(obj){
obj.name="LSN";
}
var person=new Object();
setName(person);
alert(person.name);//LSN
執(zhí)行結(jié)果是:LSN。在這段代碼中耻讽,函數(shù)setName的作用是給obj對(duì)象添加了一個(gè)屬性name并給該屬性賦值為"LSN",因?yàn)閛bj是引用類型,所以這里屬于是將引用類型person賦值給了obj帕棉,也就是說(shuō)person和obj引用了一個(gè)內(nèi)存地址针肥,所以當(dāng)給obj新加了屬性name時(shí),在函數(shù)外面的person也跟著改變香伴,最后person.naem的結(jié)果為L(zhǎng)SN慰枕。
引用類型傳遞參數(shù)到底傳的是值還是引用
function setName(obj){
obj.name="ABC";
obj=new Object();
obj.name="BCD";
}
var person=new Object();
setName(person);
alert(person.name);// ABC
執(zhí)行結(jié)果是:ABC。實(shí)例3與實(shí)例2的區(qū)別是在函數(shù)中又加了2行代碼即纲,在給obj對(duì)象新加一個(gè)屬性name并賦值后 又將obj定義成了一個(gè)新的對(duì)象(new Object())具帮,定義新對(duì)象后又name賦上新的值“BCD”。這個(gè)時(shí)候如果是按引用傳遞的話低斋,那么最后person對(duì)象就會(huì)自動(dòng)修改為指向其name屬性為"BCD"的新對(duì)象蜂厅,但最后顯示的卻是“ABC”,這說(shuō)明即使在函數(shù)內(nèi)部修改了參數(shù)的值膊畴,但原始的引用還保持不變掘猿。實(shí)際上,當(dāng)在函數(shù)內(nèi)部obj=new Object()時(shí) 這個(gè)新的obj就已經(jīng)成為函數(shù)內(nèi)部的局部對(duì)象了唇跨,這個(gè)對(duì)象會(huì)在函數(shù)執(zhí)行完畢后自動(dòng)銷毀稠通。
兩種變量類型檢測(cè)
1.? Typeof操作符是檢測(cè)基本類型的最佳工具;
2. ?如果變量值是nul或者對(duì)象买猖,typeof 將返回“object”改橘;
3.?? Instanceof用于檢測(cè)引用類型,可以檢測(cè)到具體的玉控,它是什么類型的實(shí)例飞主;
4.?? 如果變量是給定引用類型的實(shí)例,instanceof操作符會(huì)返回true;