JavaScript中變數和作用域

andy888 發表於 2019-08-09

JavaScript的變數與其他語言的變數有很大區別。 JavaScript 變數不 強制型別 ,決定了它只是在特定時間用於儲存特定值的一個名字而已。由於不存在定義某個變數必須要儲存何種資料型別值的規則,變數的值及其資料型別可以在指令碼的生命週期內改變。

 

變數及作用域

1. 基本型別和引用型別的值

常見的 兩種不同資料型別的值:基本型別值和引用型別值。基本型別值指的是那些儲存在棧記憶體中的簡單資料段,即這種值完全儲存在記憶體中的一個位置。而引用型別值則是指那些儲存在堆記憶體中的物件,意思是變數中儲存的實際上只是一個指標,這個指標指向記憶體中的另一個位置,該位置儲存物件。

將一個值賦給變數時,解析器必須確定這個值是基本型別值,還是引用型別值。基本型別值有以下幾種: Undefined Null Boolean Number String 。這些型別在記憶體中分別佔有固定大小的空間,他們的值儲存在棧空間,我們通過按值來訪問的。

如果賦值的是引用型別的值,則必須在堆記憶體中為這個值分配空間。由於這種值的大小不固定,因此不能把它們儲存到棧記憶體中。但記憶體地址大小的固定的,因此可以將記憶體地址儲存在棧記憶體中。這樣,當查詢引用型別的變數時,先從棧中讀取記憶體地址,然後再通過地址找到堆中的值。

定義基本型別值和引用型別值的方式 幾乎一致 的:建立一個變數併為該變數賦值。 不過 ,當這個值儲存到變數中以後,對不同型別值可以執行的操作則大相徑庭。

var test  = new Object();       // 建立引用型別

test .name = ' qf ';       // 新增 一個屬性

alert( test .name);       // 輸出

 

基本型別的值新增屬性,就會出現問題。

var test  = ' qf ';         // 建立一個基本型別

test .age = 18 ;         // 給基本型別新增屬性

alert( test .age);         //undefined

 

制變數值

在變數複製方面,基本型別和引用型別也有所不同。基本型別複製的是值本身,而引用型別複製的是地址。

var test  = ' qf ';      

var test 2 = test ;  

 

檢測型別

要檢測一個變數的型別,我們可以通過 typeof 運算子來判別

var test  = ' qf ';

alert(typeof (test) );       //string


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69942977/viewspace-2653225/,如需轉載,請註明出處,否則將追究法律責任。