字符串、數字、布爾、數組、對象、Null、Undefined
數據類型
1.? ECMAScript變量包含兩種不同類型的值:基本類型值、引用類型值;
2.?? 基本類型值:指的是保存在棧內存中的簡單數據段;
3.?? 引用類型值:指的是那些保存在堆內存中的對象,意思是,變量中保存的實際上只是一個指針,這個指針指向內存堆中實際的值;
兩種訪問方式
1.? 基本類型值:按值訪問,操作的是他們實際保存的值;
2.? 引用類型值:按引用訪問,當查詢時,我們需要先從棧中讀取內存地址,然后再順藤摸瓜地找到保存在堆內存中的值;
兩種類型復制
1、基本類型變量的復制:
從一個變量向一個變量復制時,會在棧中創建一個新值,然后把值復制到為新變量分配的位置上,改變源數據不會影響到新的變量(互不干涉);
2、引用類型變量的復制:
復制的是存儲在棧中的指針,將指針復制到棧中未新變量分配的空間中,而這個指針副本和原指針執行存儲在堆中的同一個對象,復制操作結束后,兩個變量實際上將引用同一個對象;因此改變其中的一個,將影響另一個;
函數參數的傳遞
1.? ECMA中所有函數的參數都是按值傳遞的;
在向參數傳遞基本類型的值時,被傳遞的值會被復制給一個局部變量,在向參數傳遞引用類型的值時,會把這個值在內存的地址復制給一個局部變量
基本數據類型傳遞參數
funciton addTen(num){
num+=10;
return num;
}
var count=20;
var result=addTen(count);
alert(count);//20
alert(resullt);//30
執行結果是:20和30。在這段代碼中,將變量count當做參數傳遞給了函數addTen,也就是相當于將變量count的值復制給了函數addTen的參數。這時addTen的參數num可以看做是函數內部的一個變量。在上段代碼中,就相當于兩個基本數據類型變量之間的值復制。而基本數據類型都有自己獨立的內存地址,所以num和count是沒有任何關系的,他們只是值相等而已,函數執行完畢后,count的值并沒有改變。而函數外面的result是被直接賦值的,所以result的值就是函數的結果30。
引用類型傳遞參數
function setName(obj){
obj.name="LSN";
}
var person=new Object();
setName(person);
alert(person.name);//LSN
執行結果是:LSN。在這段代碼中,函數setName的作用是給obj對象添加了一個屬性name并給該屬性賦值為"LSN",因為obj是引用類型,所以這里屬于是將引用類型person賦值給了obj,也就是說person和obj引用了一個內存地址,所以當給obj新加了屬性name時,在函數外面的person也跟著改變,最后person.naem的結果為LSN。
引用類型傳遞參數到底傳的是值還是引用
function setName(obj){
obj.name="ABC";
obj=new Object();
obj.name="BCD";
}
var person=new Object();
setName(person);
alert(person.name);// ABC
執行結果是:ABC。實例3與實例2的區別是在函數中又加了2行代碼,在給obj對象新加一個屬性name并賦值后 又將obj定義成了一個新的對象(new Object()),定義新對象后又name賦上新的值“BCD”。這個時候如果是按引用傳遞的話,那么最后person對象就會自動修改為指向其name屬性為"BCD"的新對象,但最后顯示的卻是“ABC”,這說明即使在函數內部修改了參數的值,但原始的引用還保持不變。實際上,當在函數內部obj=new Object()時 這個新的obj就已經成為函數內部的局部對象了,這個對象會在函數執行完畢后自動銷毀。
兩種變量類型檢測
1.? Typeof操作符是檢測基本類型的最佳工具;
2. ?如果變量值是nul或者對象,typeof 將返回“object”;
3.?? Instanceof用于檢測引用類型,可以檢測到具體的,它是什么類型的實例;
4.?? 如果變量是給定引用類型的實例,instanceof操作符會返回true;