在程序开发中,已经有上面的运算符和数据类型了,可以满足了大部的需求,但是这些程序还是比较简单的计算和逻辑运算,如果需要复杂的计算和逻辑处理,就需要采用复杂逻辑程序块来处理了,也就是复杂条件语句才能解决。主要的语句有条件语句、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}'`)
}
}
}
到这里就学习完成基本的语句,这些需要经常练习才能合适地使用它。