Skip to content

流程控制

es6 代码块

一切用大括号括起来的 js 代码语句。

javascript
{
    //代码块,熟人打招呼
    console.log("hello!")
    console.log("nice to meet you!")
}

{
    //代码块,陌生人打招呼
    console.log("who are you!")
}

if语句

代码都是有一定完整的功能逻辑的,代码的执行过程中代码会选择性的执行。我们要对流程进行控制

javascript
let isDD = true
if (isDD) {
    console.log("DD斩首")
} else {
    console.log("保护起来")
}
//流程控制的时候需要逻辑翻译,如果高兴...否则...

其中,if 括号里的表达式结果会被强制转换为true/false
第一个代码块是结果为真所执行的代码,第二个代码块是结果为假执行的代码
其中else{}可以不写。如果代码块只有一条语句可以不写大括号,但是不推荐

三目运算符

相当于 if else 语句的简写。

javascript
// 语法: expression ? sentence1 : sentence2
true ? 2 : 3 //2
let words = test("sw") ? "good" : "not" + "good"

switch语句

如果某个判断比较复杂,比如数目的多少或者范围,不是简单的真假,用 switch case

javascript
let sex = getSex("犬山哥") //返回这个人的性别
switch (
    sex //对sex判断
) {
    case "男": //如果不满足就寻找下一个case
        console.log("左转")
        break //后续的case不需要进行判断了
    case "女":
        console.log("右转")
        break
    default: //以上都不满足的执行
        console.log("秀吉")
}

for语句

通常用于控制循环次数的循环方法

javascript
for (let i = 0; i < 10; i++) {
    console.log(`我是第${i}次执行的`)
}
/*其中,for(A;B;D){
    C;
}
A: 循环开始前的初始化操作
B: 循环的结束条件判断,如果是真,则继续循环,如果是假则退出循环
D: 单次循环完成之后的状态叠加或者改变
C: 可以填写若干条被循环的代码
*/

注意:

  • 按 ABCD 顺序执行
  • B 条件写错可能会死循环(浏览器未响应)
javascript
let i = 5
for (; i < 10;) {
    console.log(i)
    i = i + 1
} //合法代码,但是不推荐

对于可迭代对象的遍历:for...in

javascript
let arr = [1, 2, 3, 5]
for (let i in arr) {
    console.log(i)
}
//挨个打印对象每个属性的键名(字符串) '0' '1' '2' '3'
let obj = {
    a: 1,
    b: 2,
}
for (let i in obj) {
    console.log(i)
}
//挨个打印对象每个属性的键名:a b
//但是对于类数组如document.querySelectorAll("div")
//遍历会打印对象本身及其原型链上的属性,所以不建议用

实现了迭代器接口(数组类数组字符串)则可以使用for...of

javascript
let arr = [1, 2, 3, 5]
for (let i of arr) {
    console.log(i) //1, 2, 3, 5
}
for (let i of "asd") {
    console.log(i) //"a" "s" "d"
}

while语句

和 for 循环的本质是一样的,但是没有循环开始的初始化操作和循环的状态的改变。

javascript
while (isNotDeadLine()) {
    struggle("一下")
} //如果截至日期还没到,挣扎一下。完事了再来
/* while(A){
 *    B;
 * }
 * 其中:
 * A: 每次循环开始前的判断
 * B: 循环的若干代码
 */

while可以转换成for循环

do while语句

while唯一区别是判断和循环交换顺序

javascript
do {
    struggle("一下下")
} while (isNotDeadLine())
//先挣扎一下,再看看还可不可以有时间在挣扎一次,可以就再来
/*其中 do{
 *      B;
 *     } while(A);
 *  B: 循环的若干代码
 *  A: 每次循环结束后判断
 */

continue/break关键字

continue;跳出此次循环,此次循环后续的代码不需要执行,下次循环依旧执行

javascript
for (let i = 0; i < 5; i++) {
    console.log(i)
    if (i == 3) continue
    console.log(i)
} // 0 0 1 1 2 2 3 4 4

其中:for循环前面可以添加循环名(标签),通过continue 循环名的方式跳过指定循环体

javascript
forA: for (let i = 0; i < 10; i++) {
    if (i == 3) continue forA
    forB: for (let j = 0; j < 10; j++) {
        if (j == 5) continue forB
        console.log(i, j)
    }
} //i=4不会打印且j=5不会打印

breakcontinue类似,但是不是跳过此次循环,而是结束当前循环

javascript
for (let i = 0; i < 5; i++) {
    console.log(i)
    if (i == 3) break
    console.log(i)
} // 0 0 1 1 2 2 3

continue可以添加循环名(标签)

javascript
forA: for (let i = 0; i < 10; i++) {
    if (i == 3) break forA
    forB: for (let j = 0; j < 10; j++) {
        if (j == 5) break forB
        console.log(i, j)
    }
} //i>=4不会打印且j>=5不会打印

异常捕获

程序在运行时出错 ,可以被捕获并接着运行。

javascript
try {
    // 可能出现异常的代码
} catch (e) {
    // 出现异常以后执行的代码
    // e:exception,用来捕获异常的信息
}

抛出异常 归档在 24-生成器和Promise


练习题

  1. 做一个 99 乘法表,注意换行
  2. 计算 n 的阶乘 n!的结果
  3. 打印出所有的 "水仙花数 "。
    所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。
    例如:153 是一个 "水仙花数 ",因为 153 等于 1^3 + 5^3 + 3^3。
  4. 5 文钱可以买一只公鸡,3 文钱可以买一只母鸡,1 文钱可以买 3 只雏鸡。
    现在用 100 文钱买 100 只鸡,那么各有公鸡、母鸡、雏鸡多少只?
    请编写程序实现。