- 宣告及使用變數時會動態配置記憶體。
- 具有回收記憶體的機制( Garbage Collection,GC ),但無法由程式控制。
每隔一段時間會自動搜尋不使用的物件,釋放記憶體。而變數當其作用範圍結束,GC就會將記憶體釋放。
變數的作用範圍:
- 區域變數( local variables ):
區域變數只能在程式執行到某一特定區域時才有作用,當程式執行完該區域並離開後,變數就失效,並釋放出記憶體。
例如在一函數內宣告的變數,就只能在這個函數內使用,當函數執行完畢並返回後,變數就失效。
- 全域變數( global variables ):
全域變數在整個程式中的任何地方均可以使用,直到整個程式執行結束。
變數的宣告
可以使用 var、let關鍵字來宣告變數,使用 const關鍵字來宣告常數。
而let、const是在ES6才加入正式規範中。
使用var宣告變數:
使用變數有兩個動作宣告、初始化(給變數一個初始值),我們可以先宣告再賦予初始值或宣告時一併初始化。
宣告變數時不須加上型別,JavaScript自動根據資料轉換變數的data type。
- 宣告1個變數:
var a;
- 宣告多個變數:
var a,b,c;
- 宣告變數並一併賦予初始值:
- 宣告變數後,再初始化:
var changeVal;
changeVal=123; //變數changeVal的內容為數值
changeVal="string_test"; //變數changeVal的內容為字串
- 變數使用前,必須先宣告,否則會出現referenceError。例:var a=b+1; 宣告a並初始化,但初始化時所使用到的變數b並無宣告,b+1出現錯誤。
- 變數可以省略宣告並直接初始化,但省略宣告的變數都會被視為全域變數。
var宣告變數的作用域:
var a=2; //a為全域變數
function call(){
var a=5,b=8;
document.write("a+b=",a+b);
}
call();
document.write("a=",a);
輸出結果:
宣告在函數call()中的變數a=5、b=8為區域變數,作用的範圍只在call()函數內,不影響函數外的全域變數a=2。
上述程式調整後如下,輸出結果則完全不同:
輸出結果:
Hoisting(提升)特性:
程式在開始執行前,會先建立一個執行環境,程式內的變數、函數等物件會被先建立,等到執行階段才會賦值,所
以呼叫變數、函數等物件的程式碼即使放在宣告之前,程式仍然可以正常運作。
例如:
document.write("呼叫變數a=",a);
var a;
a=5;
[輸出結果]:
使用let宣告變數:
- let關鍵字的宣告方式與var相同。
- JavaScript程式中的區塊會使用一對大括號{}來限制,除了純粹定義範圍的區塊之外,還有if、else、while、for等控制區塊及函數區塊等。
- 只有在函式區塊中,var宣告的為區域變數。
- 在ES6中規範了let具有區塊作用域功能,程式區塊內為區域變數,區塊外為全域變數。
- 使用let宣告較為嚴謹。變數尚未初始化前,不會以undefined去初始化變數,所以變數尚未初始化之前將無法操作(暫時死區Temporal Dead Zone;TDZ)。
例如:let、Var作用域的不同
[輸出結果]:
console平台顯示有關變數z的錯誤訊息:
例如:var、let宣告,在變數初始化之前的差異
[輸出結果]:
使用const宣告常數:
- const也是ES6中心加入的宣告方式。用來宣告常數,宣告時必須指定初始值,且宣告之後不能再改變其值。
- const亦具有區塊作用域的概念。
變數命名的限制:
- 第一個字元必須是字母或底線(_),之後的字元可以是數字、字母、底線。
- 有區分英文字母大小寫。例:var A; var a; ,A、a大表不同的變數。
- 保留字不能使用。
變數型別的轉換:
JavaScript具有自動轉換資料型別的特性,因此撰寫程式時要注意自動轉型可能造成的錯誤。
例如:
程式:
[輸出結果]:
轉換型別內建函數:parseInt()將字串轉換為整數
會從字串最左邊的字元開始轉換,直到字串結束或遇到非數字的字元為止。若字串無法轉換為數值,則會傳回NaN。
例如:
程式:
[輸出結果]:
轉換型別內建函數:parseFloat()將字串轉換為浮點數
用法和parseInt()相同。
例如:
程式:
[輸出結果]:
轉換型別內建函數:Number()將物件或字串轉換為數值
若物件或字串無法轉換成數值,則會傳回NaN。
例如:
程式:
[輸出結果]:
typeof:傳回資料型別
型別運算子typeof能夠傳回資料的型別。
用法一:typeof data;
用法二:typeof(data);
例如:
程式:
[輸出結果]: