JAVAScript的變量與其他語言的變量有很大區別。JavaScript變量不是強制類型的,決定了它只是在特定時間用于保存特定值的一個名字而已。由于不存在定義某個變量必須要保存何種數據類型值的規則,變量的值及其數據類型可以在腳本的生命周期內改變。
變量及作用域
1.基本類型和引用類型的值
常見的兩種不同數據類型的值:基本類型值和引用類型值?;绢愋椭抵傅氖悄切┍4嬖跅却嬷械暮唵螖祿?,即這種值完全保存在內存中的一個位置。而引用類型值則是指那些保存在堆內存中的對象,意思是變量中保存的實際上只是一個指針,這個指針指向內存中的另一個位置,該位置保存對象。
將一個值賦給變量時,解析器必須確定這個值是基本類型值,還是引用類型值?;绢愋椭涤幸韵聨追N:Undefined、Null、Boolean、Number和String。這些類型在內存中分別占有固定大小的空間,他們的值保存在??臻g,我們通過按值來訪問的。
如果賦值的是引用類型的值,則必須在堆內存中為這個值分配空間。由于這種值的大小不固定,因此不能把它們保存到棧內存中。但內存地址大小的固定的,因此可以將內存地址保存在棧內存中。這樣,當查詢引用類型的變量時,先從棧中讀取內存地址,然后再通過地址找到堆中的值。
定義基本類型值和引用類型值的方式幾乎一致的:創建一個變量并為該變量賦值。不過,當這個值保存到變量中以后,對不同類型值可以執行的操作則大相徑庭。
var test = new Object(); //創建引用類型
test.name = 'qf'; //添加一個屬性
alert(test.name); //輸出
基本類型的值添加屬性,就會出現問題。
var test = 'qf'; //創建一個基本類型
test.age = 18; //給基本類型添加屬性
alert(test.age); //undefined
復制變量值
在變量復制方面,基本類型和引用類型也有所不同?;绢愋蛷椭频氖侵当旧?,而引用類型復制的是地址。
var test = 'qf';
var test2 = test;
檢測類型
要檢測一個變量的類型,我們可以通過typeof運算符來判別。
var test = 'qf';
alert(typeof (test)); //string