iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 2
0
Modern Web

前端常見問題攻略系列 第 2

JavaScript 表達式觀念及運用 - JS Expression

  • 分享至 

  • xImage
  •  

JavaScript 分為兩大的語句類型,就像是我們日常語言中的動詞、名詞、連接詞等概念,但在 JS 中僅分為兩大類型,分別為「陳述式」及「表達式」,其中表達式更為重要,如果能夠熟練表達式更能解決許多開發上的問題,也更能活用各種語法。

JavaScript 中的表達式原文為 「Expression」,翻譯上常見的有表達式、表示式、運算式等等。

表達式與陳述式的差異

表達式及陳述式在各文件上都有概略提到,但通常不會讓人覺得是重要的篇章,所以快速略過。不過在 JavaScript 的運用中,如果熟練「表達式」的觀念,將能增加許多運用的技巧且能避免許多不必要的錯誤。

  • 陳述式:會執行一些程式碼,可能是幾個單詞或是一個片段(但不會是單一個字母),但最大的特徵是不會回傳結果
  • 表達式:最大的特徵在於會回傳結果

陳述式 Statement

陳述式有幾大分類,如:

  • 宣告(var、function)
  • 流程控制(block、if...else)
  • 迴圈(for、for...in)
  • 其它(import, export)

完整分類可參考 MDN

陳述式可能是幾個單詞或是一個片段(但不會是單一個字母),其中也會混合到表達式的詞彙,所以當我們撰寫一段程式碼如下即可稱為陳述式(注意:是 var a ,而不是 var 也不是 a),用此語法即可宣告一個變數。

var a;

相同的道理,如果我們僅有使用 {} 這個意思是「物件」,這不會是一個陳述式,必須在其中加入一些片段程式碼才會是陳述式,結構如下:

{
  console.log(a);
}

陳述式先了解至此即可,我們先來看表達式。

表達式 Expression

表達式的特點就是會回傳一個結果,所以任何可回傳結果都可稱為表達式(這句話看起來就是一段廢話,但實際運作時卻常常讓人有錯誤的判斷)。常見如下:

  • 純值
  • 變數
  • 運算子
  • 執行函式
  • 正規表達式
  • 函式表達式
  • ...

表達式的重點在於「回傳結果」,因此是否能夠回傳結果就能判斷該語句或詞是否為表達式,我們用數字 1 來解釋什麼是回傳結果。

1

直接打開你的 Chrome 的開發者工具,將上面的數字 1 貼到開發者工具內後按下 Enter,你會看到兩個數字 1 分別如下顯示:

https://ithelp.ithome.com.tw/upload/images/20200917/20083608voNLmlHgef.png

因此在這之中數字 1 就是表達式(是的,單一個純值就是表達式),接下來加入一些運算子增加這段程式的複雜度,使用兩個數字 1 來進行比對。

1 === 1

接下來會得到 true 的結果,所以 1 === 1 是屬於表達式。

https://ithelp.ithome.com.tw/upload/images/20200917/20083608IuSMHc0Aw5.png

相同的概念,如果定義了一個函式並運行它,那麼運行所回傳的結果也會稱為表達式。

// 函式陳述式宣告一個函式
function fn() {
  return 1;
};

// 呼叫函式
fn();

https://ithelp.ithome.com.tw/upload/images/20200917/20083608aY8RkSr1Rr.png

容易搞混的地方

“式” 這個字在中文通常表示為一段文字,所以我們常會誤解表達式、陳述式代表的是一個完整片段;而實際運作上陳述式大多是一個片段或詞彙沒錯,但表達式可以獨立出現,也可與陳述式混合使用。

以下片段程式碼整體來說是屬於陳述式(運作上不會回傳結果),但其中會夾雜許多表達式的語句。

if (a) {
  fn(); // 函式呼叫後會回傳結果,因此也屬於表達式
}

圖解案例:

https://ithelp.ithome.com.tw/upload/images/20200917/20083608yuPvqDDBLf.png

當然,還有多個表達式混合的概念,如運算子本身就是由多個表達式組成,常見的「二元運算子」,就是由一個運算子加上前後的運算元所組成,而運算元也是屬於表達式的一種。關於運算子可參考

運算元1 運算子 運算元2

範例如下:

1 === 1;

https://ithelp.ithome.com.tw/upload/images/20200917/20083608qoscVLfhDU.png

所以在此範例中,也可以將運算元替換成 “呼叫函式” 或 “任何的表達式”。

function fn() {
  return 1;
};
fn() === fn();

哪邊可以看到表達式

相對於死板板的陳述式來說,表達式相當靈活且無所不在,當我們在查找文件中都可看到相對應的蹤影,在此先記得 "expression" 這個單字。

記得:你可以將文件中的 expression 語句替換成任何喜歡的表達式來執行,但絕不能替換成陳述式(statement)。

案例:if 陳述式

文件:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/if...else

文件中說明 if 陳述式中的結構如下:

if (condition)
   statement1
[else
   statement2]

其中包含了 condition(條件式) 及 statement(陳述式) 這兩個語句,再往下可以看到針對這兩個語句的說明。

condition: An expression that is considered to be either truthy or falsy.
判斷式:一個表達式,它的值會被判定為真值或假值。

因此 if 後方的條件式可以使用任何的表達式進行替代,因此可以如下的方式替換(替換成呼叫函式、各種運算子都是沒有問題的)。

if (1 + 1) {
  console.log('1 + 1 為真值')
}

只要把握此原則就可以進行任何的替換,但絕對不能替換成陳述式,陳述式則會出現語法上的錯誤。

if (var a = 1) {
  // ...
}

https://ithelp.ithome.com.tw/upload/images/20200917/20083608fc7HVDxGW7.png

結語

表達式在 JavaScript 是看似簡單的觀念,但了解以後可以更靈活運用許多語法,除此之外有許多的設計模式及觀念,也都是必須靈活運用表達式才可達成。

本篇附上幾個題目,大家可試著猜看看該片段程式碼屬於 “陳述式” 或 “表達式” 喔

題目 1:

var object;

題目 2:

new Object(1);

上一篇
JavaScript 開發中常見錯誤解決辦法
下一篇
JavaScript 利用表達式優化你的程式碼
系列文
前端常見問題攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
bluegreenking2
iT邦新手 5 級 ‧ 2021-03-02 22:26:00

我的解答
題目ㄧ:陳述式
題目二:表達式

new Object(1);
<. Number{1}

我要留言

立即登入留言