JavaScript-變數與常數

為什麼程式語言都需要變數?

變數只是個名字,只是為了要識別,讓你程式語言在計算的時候,有個放計算資料內容的容器,當你在執行的時候就可以,依照你給他的容器名稱,把他叫出來使用,變數本身沒意義。

指定又是什麼?

在程式語言中=(x 等號)而是指定,由右側的值指定給左側的變數名稱。==則是比較兩邊的值。 但在 JavaScript 中==雖然也是比較的意思,不過 JavaScript 會有自動轉型的問題,為了不要讓你的程式碼出現奇怪的內容,建議使用更為嚴謹的===。

變數的命名

  • 可以使用英文字母或數字,但第一個字不可以是數字。
  • 不能使用保留字
  • 注意英文大小寫有差
保留字
break case catch class const continue debugger
default delete do else export extends finally
for function if import in instanceof new
return super switch this throw try typeof
var void while with yield
變數命名需清楚與有意義。

變數名稱慣例

  1. CamelCase(JavaScript)

  1. camelCase

  1. snake_case(Ruby)

變數有沒有宣告有差嗎? 有宣告叫變數,沒宣告叫指定。

變數 未定義(undefined) VS 沒有定義(not define)

變數提昇(variable hoisting)與暫時性死區

JavaScript 在瀏覽器執行時會有兩個階段,一個叫建立期(creation phases)另一個是執行期(execution phases)。官網上的說明
  1. 建立期 JavaScript 會先將你宣告的變數儲存,再給他一個初始化的值 undefined。

  2. 執行期再按照程式碼逐行執行代碼,將值分配給變量,並執行函數調用。

ES6 後為了要修正 JavaScript 這個問題新增了 let 變數與 const 常數,在 let 與 const 上第一張圖執行結果與 var 變數是相同的,差別在與第二張圖,let 與 const 多了一個叫 TDZ(暫時死區),執行後的結果會有所差異,請看下圖。

範圍鏈(Scope chain)

從上圖可知在 function 裡的 var 變數不會影響到外部程式,可在 if 身上會影響到外面的 console.log(a),代表 var 是 function scope。

同理從上圖可知 function 裡的 let 變數不會影響到外部程式,在 if 身上也不會影響到外面的 console.log(a),代表 let 是 block scope{}。

let,const,var 怎麼選擇?

  • 能用 const 就用 const,不能用 const 就改用 let
  • var 也可以用,只是它的範圍(Scope)比較大一些
  • 千萬不要沒宣告就拿來用,那會造成全域物件的污染
var let/const
Scope function scope block scope{}
重複宣告 不可
變數內容重複指定 可/不可
可能會造成全域屬性 不會
變數提昇 有(被 TDZ 罩住)

JavaScript 2 種型別

  1. 原始型別
    1. 數字 (Number)
    2. 字串 (String)
    3. 真假值 (Boolean)
    4. 空值 (Null)
    5. 未定義 (Undefined)
    6. 符號 (Symbol)
  2. 物件型別
    1. 陣列(Array)
    2. 函數(Function)
    3. 物件(Object)
對 JavaScript 來說,false,0,"",undefind,null,NaN 都是假的,其餘為真。
comments powered by Disqus