在程序開發中,已經有上面的運算符和數據類型了,可以滿足了大部的需求,但是這些程序還是比較簡單的計算和邏輯運算,如果需要復雜的計算和邏輯處理,就需要采用復雜邏輯程序塊來處理了,也就是復雜條件語句才能解決。主要的語句有條件語句、switch語句、條件表達式語句、for循環語句、for-of語句、while語句、Do-while語句、Break語句、Continue語句、Throw和Try語句。
If語句
if語句用于需要根據邏輯條件執行不同語句的場景。當邏輯條件為真時,執行對應的一組語句,否則執行另一組語句(如果有的話)。 else部分也可能包含if語句。
if (condition1) {
??// 語句1
} else if (condition2) {
??// 語句2
} else {
??// else語句
}
采用的形式如上所示。
但是可以有幾種形式,第一種形式:
這種只有if語句部分,并沒有else部分。
第二種形式:
這里有if部分和else部分,
最后一種形式就是if和else嵌套形式:
通過if-else語句,就可以執行復雜的邏輯語句,因為每一個大括號里都是一塊更加復雜的語句,這樣就可以不斷一層一層判斷,就可以解決更多的邏輯處理問題。不過在編程時要注意嵌套的層次,一般不要超過三層的嵌套,如果要超過這個,就需要分成不同的函數來嵌套調用。
條件語句是使用比較多的語句,畢竟很多判斷選擇都需要使用它。
Switch語句
使用switch語句來執行與switch表達式值匹配的代碼塊。這種情況一般是一個變量存在多個狀態,選擇其中一個執行。特別適合狀態機這樣處理,又或者適合減少if語句的編寫。像狀態機多層狀態的選擇就比較容易理解。
switch (expression) {
??case label1: // 如果label1匹配,則執行
????// ...
????// 語句1
????// ...
????break; // 可省略
??case label2:
??case label3: // 如果label2或label3匹配,則執行
????// ...
????// 語句23
????// ...
????break; // 可省略
??default:
????// 默認語句
}
下面的例子:
switch表達式的類型必須是number、enum或string。
label必須是常量表達式或枚舉常量值。
如果switch表達式的值等于某個label的值,則執行相應的語句。
如果沒有任何一個label值與表達式值相匹配,并且switch具有default子句,那么程序會執行default子句對應的代碼塊。
break語句(可選的)允許跳出switch語句并繼續執行switch語句之后的語句。
如果沒有break語句,則執行switch中的下一個label對應的代碼塊。
條件表達式
條件表達式由第一個表達式的布爾值來決定返回其它兩個表達式中的哪一個。
condition ? expression1 : expression2
例子如下:
條件表達式比較適合用來判斷大小的情況。或者簡短的條件選擇,不用寫if語句這么復雜的情況。
For語句
for語句會被重復執行,直到循環退出語句值為false。
循環語句是比較常用的語句,畢竟很多數據的處理都是一個隊列,或者列表,那么就需要遍歷檢查它是否滿足某種情況。
比如下面的例子:
for循環語句的形式:
for ([init]; [condition]; [update]) {
??statements
}
for語句的執行流程如下:
1、 執行init表達式(如有)。此表達式通常初始化一個或多個循環計數器。
2、 計算condition。如果它的值為true(或者沒有該語句),則執行循環主體的語句。如果它的值為false,則for循環終止。
3、 執行循環主體的語句。
4、 如果有update表達式,則執行該表達式。
5、 回到步驟2。
For-of語句
使用for-of語句可遍歷數組或字符串。示例如下:
for (forVar of expression) {
??statements
}
具體的例子如下:
While語句
只要condition的值為true,while語句就會執行statements語句。示例如下:
while (condition) {
??statements
}
例子如下:
基中條件部分是一個邏輯表達式。
Do-while語句
在condition的值為false之前,statements語句會重復執行。示例如下:
do {
??statements
} while (condition)
這種情況是先執行復雜語句,再判斷條件,而while語句是先判斷條件再執行復合語句。
Break語句
使用break語句可以終止循環語句或switch。
前面已經在switch里使用了,用于跳出每一個分支情況。它還可以使用在循環里,可以提前跳出循環,比如循環執行一半,再判斷滿足了條件,如果沒有break語句,就沒有辦法提前退出循環了。
上面的例子就是提前退出了循環,由于這個循環是一個無窮的循環,如果沒有退出語句,就沒有辦法這樣編寫了。
如果break語句后帶有標識符,則將控制流轉移到該標識符所包含的語句塊之外。
let x = 1
label: while (true) {
??switch (x) {
????case 1:
??????// statements
??????break label // 中斷while語句
??}
}
Continue語句
continue語句會停止當前循環迭代的執行,并將控制傳遞給下一個迭代。
let sum = 0
for (let x = 0; x < 100; x++) {
??if (x % 2 == 0) {
????continue
??}
??sum += x
}
在上面的循環里,執行到continue語句時,就會提前結束當前循環,不再執行后面的sum += x的語句。
Throw和Try語句
throw語句用于拋出異常或錯誤:
throw new Error('this error')
try語句用于捕獲和處理異常或錯誤:
try {
??// 可能發生異常的語句塊
} catch (e) {
??// 異常處理
}
支持finally語句:
function processData(s: string) {
??let error: Error | null = null
??try {
????console.log('Data processed: ', s)
????// ...
????// 可能發生異常的語句
????// ...
??} catch (e) {
????error = e as Error
????// ...
????// 異常處理
????// ...
??} finally {
????if (error != null) {
??????console.log(`Error caught: input='${s}', message='${error.message}'`)
????}
??}
}
到這里就學習完成基本的語句,這些需要經常練習才能合適地使用它。