JavaScript中的變數

JavaSctipt:

  1. 宣告及使用變數時會動態配置記憶體。

  2. 具有回收記憶體的機制( Garbage Collection,GC ),但無法由程式控制。 每隔一段時間會自動搜尋不使用的物件,釋放記憶體。而變數當其作用範圍結束,GC就會將記憶體釋放

變數的作用範圍:

  1. 區域變數( local variables ):
    區域變數只能在程式執行到某一特定區域時才有作用,當程式執行完該區域並離開後,變數就失效,並釋放出記憶體。
    例如在一函數內宣告的變數,就只能在這個函數內使用,當函數執行完畢並返回後,變數就失效。

  2. 全域變數( global variables ):
    全域變數在整個程式中的任何地方均可以使用,直到整個程式執行結束。

變數的宣告

可以使用 var、let關鍵字來宣告變數,使用 const關鍵字來宣告常數。 而let、const是在ES6才加入正式規範中。

使用var宣告變數:

使用變數有兩個動作宣告、初始化(給變數一個初始值),我們可以先宣告再賦予初始值或宣告時一併初始化。 宣告變數時不須加上型別,JavaScript自動根據資料轉換變數的data type。
  1. 宣告1個變數:
    var a;
  2. 宣告多個變數:
    var a,b,c;
  3. 宣告變數並一併賦予初始值:
  4. 宣告變數後,再初始化:
    var changeVal;
    changeVal=123; //變數changeVal的內容為數值
    changeVal="string_test"; //變數changeVal的內容為字串
  5. 變數使用前,必須先宣告,否則會出現referenceError。例:var a=b+1; 宣告a並初始化,但初始化時所使用到的變數b並無宣告,b+1出現錯誤。
  6. 變數可以省略宣告並直接初始化,但省略宣告的變數都會被視為全域變數

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宣告變數:

  1. let關鍵字的宣告方式與var相同。
  2. JavaScript程式中的區塊會使用一對大括號{}來限制,除了純粹定義範圍的區塊之外,還有if、else、while、for等控制區塊及函數區塊等。
  3. 只有在函式區塊中,var宣告的為區域變數。
  4. 在ES6中規範了let具有區塊作用域功能,程式區塊內為區域變數,區塊外為全域變數
  5. 使用let宣告較為嚴謹。變數尚未初始化前,不會以undefined去初始化變數,所以變數尚未初始化之前將無法操作(暫時死區Temporal Dead Zone;TDZ)。
例如:let、Var作用域的不同


[輸出結果]:
console平台顯示有關變數z的錯誤訊息:


例如:var、let宣告,在變數初始化之前的差異


[輸出結果]:


使用const宣告常數:

  1. const也是ES6中心加入的宣告方式。用來宣告常數,宣告時必須指定初始值,且宣告之後不能再改變其值。
  2. const亦具有區塊作用域的概念。

變數命名的限制:

  1. 第一個字元必須是字母或底線(_),之後的字元可以是數字、字母、底線。
  2. 有區分英文字母大小寫。例:var A; var a; ,A、a大表不同的變數。
  3. 保留字不能使用。



變數型別的轉換:

JavaScript具有自動轉換資料型別的特性,因此撰寫程式時要注意自動轉型可能造成的錯誤。
例如:
程式:

[輸出結果]:

轉換型別內建函數:parseInt()將字串轉換為整數

會從字串最左邊的字元開始轉換,直到字串結束或遇到非數字的字元為止。若字串無法轉換為數值,則會傳回NaN。
例如:
程式:

[輸出結果]:

轉換型別內建函數:parseFloat()將字串轉換為浮點數

用法和parseInt()相同。
例如:
程式:

[輸出結果]:

轉換型別內建函數:Number()將物件或字串轉換為數值

若物件或字串無法轉換成數值,則會傳回NaN。
例如:
程式:

[輸出結果]:

typeof:傳回資料型別

型別運算子typeof能夠傳回資料的型別。
用法一:typeof data;
用法二:typeof(data);
例如:
程式:

[輸出結果]: