繼上個章節裡提到的 JavaScript 的陳述式與表達式是什麼呢?剛好看到下個章節有介紹,開始整理重點!
如何判斷陳述式與表達式?
最簡單的判斷法就是「會回傳值」就是表達式。
表達式長什麼樣子?
打開開發者模式,輸入表達式之後按下 enter 會出現一列前方帶有 < 符號,那就是瀏覽器回傳的結果,而會回傳值的就是表達式。
表達式可以是
- 一個值:數字 1…
- 變數:a、user…..
- 運算子:1 === 1、 a = 1
- 調用函式:fn()
- 變形的函式陳述式:在函式陳述式前後加上小括號也是一種表達式,回傳結果為函式本身
陳述式長什麼樣子?
陳述式常見的分類則有
- 宣告(var a、let a、const a、function a(){…})
- 流程控制(block、if else)
- 迴圈(for、for…in)
- import、export
相對於表達式,陳述式在瀏覽器模式輸入之後,按下 enter 則會回傳 undefined 像是這樣
使用情境
流程控制
常見的 if…else 運用是根據條件的 true 或 false 進行判斷,而 if 的條件(condition)可以放入任何表達式:
放入陳述式則會顯示 SyntaxError:
函數陳述式&函數表達式
函式陳述式一定是具名函式,否則無法調用(當然就沒用了),下例就是一個名稱為 hello 的具名函式:
1 | function hello(){} |
函數表達式可能為具名函式或匿名函式:
這邊我們看到裡面的 hey 函式不能在外部被調用,雖然在函式內部可以呼叫,但實務上不太常出現需要這麼做的情況(有但是很少!某些風格規範會建議都要具名)。最後呼叫這個函式還是要用 hi(),那麼,這個 hey 的命名就變得有些多餘,表達式就可以改成這樣:
1 | const hi = function(){ |
補充
1. 陳述式中可能包含表達式的片段
可以看見,雖然有運算子的結構,但它的本質依舊是宣告,不會回傳結果。
2. 調用函式是表達式?function 是陳述式?
明明就有設定 return 的結果,為什麼是陳述式?因為放到瀏覽器上執行依舊會是 undefined,它的本質還是宣告,宣告 fn()這個函式。
而上面提過的,調用函式則是表達式,會回傳 fn()的結果,相對的,不寫 return 結果一樣是 undefined,但它依舊是表達式(回傳值為 undefined)。
3. 變形的陳述式暗藏陷阱
上面提過流程控制的 condition 只能放表達式,加上小括號的陳述式是一種表達式,而它回傳的值是函式本身,會被判斷為 true,所以這個判斷式會執行 true 的結果。
參考資料:
看完這本就會懂!帶你無痛提升 JavaScript 面試力:精選 55 道前端工程師的核心問題 × 求職加分模擬試題解析