寫 JavaScript 的時候,你會不斷碰到兩個詞:「表達式」和「陳述式」。
這兩個概念聽起來很學術,但其實很好懂。
搞清楚它們的差別,會幫助你理解程式碼到底在做什麼。
這篇文章會用簡單的方式,帶你一步步認識這兩個核心概念。
JavaScript 資料值是什麼?
在前一章裡,我們學過怎麼建立資料值(像是數字、文字),也學過怎麼用運算子把這些資料值組合起來,產生新的資料值。
這種「建立資料值」的做法,就是所有 JavaScript 程式的主要材料。
但光有這些資料值還不夠,你還需要知道怎麼把它們組織成一段一段的程式碼,讓程式真正運作起來。
這就是「表達式」和「陳述式」在做的事——它們決定了資料值怎麼被使用、怎麼被組合、最終怎麼讓程式做出事情來。
什麼是表達式(Expression)?
知道了資料值是程式的材料之後,我們就可以來認識「表達式」了。
簡單來說,表達式就是任何會產生一個資料值的程式碼片段。
你可以把它想像成一個「會給你答案的東西」。
來看幾個最基本的例子:
22這就是一個表達式,它會產生數字 22 這個資料值。
"psychoanalysis"這也是一個表達式,它會產生一段文字 "psychoanalysis"。
不過,22 本身不是資料值嗎?
其實兩者並不衝突。
當你把 22 寫在程式碼裡,JavaScript 會去執行它,然後產生 22 這個資料值。
所以它既是一個資料值,同時也是一個表達式。
像這種直接寫出來的資料值,有一個專有名詞叫做「字面值」(literal)。
表達式可以組合:用運算子串起來
表達式不只是單獨的資料值,你還可以用「運算子」把多個表達式組合在一起。
組合後的結果,本身也是一個表達式。
2 + 3這裡 2 是一個表達式,3 也是一個表達式。
用 +(二元運算子)把它們串在一起後,2 + 3 整體也是一個表達式,它會產生 5 這個資料值。
一元運算子也是一樣的道理:
!falsefalse 是一個表達式,用 !(一元運算子)作用在它上面,!false 整體也是一個表達式,會產生 true。
甚至用括號包起來的表達式,也還是一個表達式:
(2 + 3)這代表你可以不斷地組合、堆疊,建立越來越複雜的計算。
表達式的巢狀結構:表達式裡面還有表達式
表達式有一個很漂亮的特性:表達式裡面可以包含其他表達式。
這就像人類語言裡的句子結構一樣。
一個句子裡面可以有子句,子句裡面又可以有更小的子句。
程式碼也是這樣:
(2 + 3) * (10 - 4)(2 + 3) * (10 - 4) 整體是一個乘法表達式。
乘號左邊的 (2 + 3) 是一個表達式,右邊的 (10 - 4) 也是一個表達式。
而 2、3、10、4 各自也都是表達式。
這種層層嵌套的結構,讓你可以用簡潔的方式描述非常複雜的計算邏輯。
什麼是陳述式(Statement)?
前面提到,表達式是會產生資料值的程式碼片段,但它只是片段,不是一個完整的指令。
陳述式(Statement)則是 JavaScript 實際會去執行的一個完整指令。
而一個程式,就是由一連串的陳述式組成的。
最簡單的陳述式,就是在表達式後面加上分號:
1;
!false;分號的作用是告訴 JavaScript:「這是一個完整的指令,到這裡為止。」
沒有分號的 1 只是一個表達式,JavaScript 不知道這算不算一個完整的指令、後面還有沒有東西。
加上分號變成 1; 之後,它就變成一個陳述式,JavaScript 會把它當作一個獨立的指令來執行。
上面的程式碼有兩個分號,所以就是兩個陳述式,合在一起就構成了一個合法的 JavaScript 程式。
什麼是副作用(Side Effect)?
不過,上面那個程式雖然合法,執行之後你什麼都看不到。
為什麼?
因為 1; 這個陳述式雖然產生了資料值 1,但產生完就丟掉了,沒有人去用它。
!false; 也一樣,產生了 true,然後就沒了。
一個陳述式如果沒有對外界產生影響,就等於什麼都沒做。
什麼意思呢?
1; 這個陳述式執行之後,JavaScript 確實產生了資料值 1,但產生完就立刻丟掉了。
它沒有把 1 顯示在螢幕上,也沒有把 1 存起來留給後面的程式碼使用。
對外界來說,這個陳述式就像從來沒有執行過一樣。
這種「對外界產生的影響」有一個專有名詞,叫做副作用(side effect)。
那什麼算是副作用呢?
以目前的學習進度來說,最直覺的例子就是「在螢幕上顯示某些內容」。
當你寫的程式碼讓螢幕上多了一行字,那就是對外界產生了改變,這就是副作用。
之後學到更多語法時,你會認識其他種類的副作用,例如改變程式內部儲存的資料。
但現在只要記住一個重點就好:陳述式光是產生資料值還不夠,要帶有副作用,才能真正做出事情來。
JavaScript 分號要不要加?
在 JavaScript 裡,大部分陳述式的結尾都要加分號 ;。
不過 JavaScript 有一個機制,在某些情況下可以幫你自動補上分號。
聽起來很方便,但問題是:什麼時候可以省略、什麼時候不行,規則很複雜,而且容易出錯。
如果省略分號,有時候上下兩行程式碼會被 JavaScript 誤認為是同一行,導致意想不到的錯誤。
所以,給初學者的建議很簡單:每個陳述式後面都加上分號。
等你對 JavaScript 更熟悉之後,再去研究哪些情況可以安全地省略。
小結
這篇文章介紹了 JavaScript 裡兩個最基本的程式碼單位:
- 表達式:會產生一個資料值的程式碼片段,例如
22、"hello"、2 + 3。 - 陳述式:JavaScript 實際會去執行的一個完整指令,程式就是由一連串陳述式組成的。
- 副作用:陳述式對外界產生的影響,例如在螢幕上顯示內容。
- 分號:建議初學者在每個陳述式後面都加上分號,避免自動補分號機制帶來的問題。
搞懂表達式和陳述式的差別,是理解 JavaScript 程式結構的第一步。