之前曾經有提到 JavaScript 是「物件導向」、「動態型別」、「弱型別」的腳本語言。
物件導向:
以物件Object
為主的設計方法。把相關的變數跟函數打包在一起,放在同一個物件裡面執行。好處是程式碼易懂好維護,彈性擴展且可重複利用。動態型別:
變數或常數不需要綁定或定義它的型別(或稱型態),只需要指定它的值。在程式執行期間,會自動根據賦予變數的值,去判斷這個變數的資料型別,然後記錄下來。弱型別:
指對型別檢查的嚴格程度很弱,僅能嚴格的區分指令和資料。說白一點就是,允許編譯器或直譯器自作主張的容許隱性型別轉換。- 優點:使用簡單,撰寫時較無太多限制。
- 缺點:風險較高。因為不包含型別資訊,所以在程式碼中可能會進行隱含的型別轉換,比如把字串(string)和數字(int)互轉,導致效能降低,並可能不符合程式語意。
接下來正式進入 JS 的基本語法。
變數 Variable
變數主要用於方便存取值,且因為 JS 是弱型別的關係,變數本身不帶有型別的資訊,而是讓編譯器或直譯器自己決定。
其實我們國中數學早就教過變數、常數和函數了,什麼 x
、y
、f(x)
之類的可怕回憶,只是 1-20 年後的現在才驚覺派上用場。
通通忘了嗎?沒關係,我也早就忘了XD...先用一張簡單的圖來解釋變數:
可以看到求包養紙箱裝著貓咪,紙箱指的就是「變數 Variable」,貓咪就是「值 Value」。
- 紙箱(變數)裡面一次只能裝一隻貓(值)。
- 紙箱(變數)當然不一定只能裝貓(值),也可以是任何東西(字串、數字、布林等不同的資料型別)。
- 如果已經裝了貓(值),也可以再替換成其他東西(任何資料型別)。
這樣是不是變得很容易理解變數的概念呢!
作用域 Scope
作用域指的是變數或常數的定義,與述句被存取到的範圍,其作用範圍可區分為「全域」和「本地端」。作用域規定了如何去找尋變數,也就是確定當前取得變數的權限。
在 JS 中,用來宣告「變數 Variable」與「常數 Constant」的關鍵字有三個,分別是 var
或 let
或 const
。
ES6 之前,宣告變數的關鍵字只有 var
,而且因為只能用「函數 Function」產生作用域,也就是只有使用函數才能劃出一個本地端的作用範圍,其他的區塊像 if
、for
、switch
、while
等,雖然有使用區塊述句 ({...})
,但卻無法界定出作用域。
ES6 之後,則多了「區塊 Block」作用域這個新的方法。每個函數內部有自己的作用域,出了作用域就無法存取函數內定義的變數。而區塊作用域可使用大括號 {}
去定義區塊範圍,且用新的關鍵字 let
或 const
去宣告區塊作用域的變數或常數。
簡單來說,當你在函數「外」宣告變數,它就會變成「全域變數」,而且是在程式碼裡的任何地方都可以被存取得到。反之,在函數「內」宣告則稱為「區域變數」,就是只作用在當前區塊而已。
關鍵字 | 宣告變數/常數 | 作用域 | 可否變動 | 版本 | 特性 |
---|---|---|---|---|---|
var |
全域變數 | 全域、函數 | 可 | ES5 | 1.宣告全域變數,或在「函數內」宣告而不管區塊範圍。 2.容易汙染全域,應避免使用。 |
let |
區域變數 | 區塊 | 可 | ES6 | 1.宣告區域變數的作用域只能在宣告的「區塊」中執行。 2.初始值可選擇性的設定。 |
const |
常數 | 區塊 | 不可 | ES6 | 1.宣告常數的作用域可以是「全域」,或在宣告的「區塊」中。 2.宣告後就不能再作修改,也不能重複宣告,且永遠存在。 |
變數宣告
語法:
var myFirstName = 'Nancy';
let myLastName = 'Lin';
const myFullName = 'Nancy Lin';
語法說明:
- 變數宣告:用
var
或let
或const
等關鍵字,依需求來宣告一個變數或常數。 - 變數名:隨意自訂,但有命名規則須遵循(規則在下方)。
- 賦值:用等號
=
(賦值運算子)來賦予一個值給變數,值可以是任何型別(如:字串、數字、布林等)。而=
並非數學中的等於或相等,而是賦予或指定的意思。 - 分號:最後使用
;
結束整個語句。
變數命名規則:
- 第一個字元,絕對不可使用數字
0-9
。 - 可包含大小寫英文字母、數字、底線
_
、錢字符號$
,但不可有其他標點符號、特殊字元或空白。 - 注意大小寫,因為寫錯會被視為不同的變數(如:
x
和X
兩個是不一樣的變數名)。 - 儘量用有語意的英文字當開頭,且以小駝峰寫法命名(如:
myFirstName
、someObject
)。 - 不能使用到保留字或關鍵字,以免程式判斷錯誤。
參考資料:
- JavaScript - 原始型別概述
- 關於JavaScript的弱型別特性
- Something About JavaScript - Day4:動態型別加弱型別不是罪
- 程式設計簡介 - 述句、運算式、運算子
- JavaScript - 3.3 變數(Variable)
- JavaScript: var, let, const 差異
- 用 1 分鐘簡單地了解 — JavaScript中 var 與 let 的主要差別
- JavaScript 你應該使用 let 而不是 var 的 3 個重要理由
- JavaScript入門 - 程式結構
- JavaScript - 超級新手小知識
上一篇:【JS幼幼班】Step.03 JavaScript 的基本概念
下一篇:【JS幼幼班】Step.05 基本語法:型別(空值、boolean、number)