目 录CONTENT

文章目录

语句

Administrator
2020-07-24 / 0 评论 / 0 点赞 / 9563 阅读 / 55453 字

语句

语句是ECMAScript编程的基本单位,所有的程序都是由语句来构成的。同时语句我们可以按功能来分类,语句也叫流程控制语句

ECMA-262 规定了一组语句(也称为流控制语句)。从本质上看,语句定义了 ECMAScript 中的主要语法,语句通常使用一或多个关键字来完成给定任务。语句可以很简单,例如通知函数退出;也可以比较复杂,例如指定重复执行某个命令的次数。

if语句

if语句也叫条件语句/分支语句,它是根据某一个条件来执行相应的代码,控制代码的流程走向。它使用的关键是ifelse

它的语法格式如下

if(条件) {
    //条件成立的代码
}
else {
    //条件不成立的代码
}
成立不成立判断条件条件成立的代码条件不成立的代码

如果(周六的考试我们全部达标了),{我们就去外面玩},{否则就在教室里面做练习}

根据上面的语法,我们可以得到下面的代码

 if(true){
     console.log("hello");
 }
else{
    console.log("world");
}

上面的代码因为if后面的条件是成立的,所以会打印输出hello

但是有一点同学们仍然要注意,因为JavaScript是弱类型语句,执行的是弱判断,所以if后面的条件可能并不是一个布尔值,如果不是布尔值,则应该通过Boolean去转换一次

var a = 123;
if(a){
    console.log("你好");
}
else{
    console.log("世界");
}

上面的代码会输出你好,因为Boolean(a)转换的结果是true,条件成立就会执行条件成立的代码

条件语句可以是多个条件结合在一起,如下面的场景

😑 场景:如果明天是晴天,我们就去郊游,如果明天下雪,我们就放假,否则我们就来教室上课

var weather = "起风了";
//现在要根据这个weather的值来决定我们的代码
if(weather === "晴天"){
    console.log("郊游去了");
}
else if(weather === "下雪"){
    console.log("放假喽");
}
else {
    console.log("上课的心情比上坟还要沉重");
}

这个时候我们就可以根据上面的代码得到下面的结果

if(条件一){
    //条件一成立的代码
}
else if(条件二){
    //条件二成立的代码
}
else {
    //条件不成立的代码
}
条件一条件二条件三判断条件条件一的代码条件二的代码条件三的代码

if与else if的区别

if是从新开始一个新的条件判断,而else if则是在上个条件后面再次加入新的条件,我们从下面两个案例来区分

第一种:if...else if... 的情况

var score = 73;
if(score>=90){
    console.log("优秀");
}
else if(score>=80){
    console.log("良好");
}
else if(score>=70){
    console.log("中等");
}
else if(score>=60){
    console.log("及格");
}
else{
    console.log("不及格");
}

这个时候的代码打印输出的结果是“中等”,因为else if它是一个整体条件,它只找到符合的条件以后,后面的就再判断

第二种

var score = 73;
if (score >= 90) {
    console.log("优秀");
}
if (score >= 80) {
    console.log("良好");
}
if (score >= 70) {
    console.log("中等");
}
if (score >= 60) {
    console.log("及格");
} else {
    console.log("不及格");
}

这个时候的代码打印输入的结果就有两个,分别是“中等”与“及格”。因为这个地方没有使用else ... if,直接 使用了if,这就相当于每次都从新开始了一个新的条件,也就相当于这几种条件是分开的,没有形成互斥关系


for循环语句

for它是JavaScript里面的一个关键字,用于执行循环的关键字,它可以让程序根据某一个条件不停的去执行循环。for 语句也是一种前测试循环语句,它在执行循环体代码之前会首先测试条件是否成立

要学习循环的语句就必须先了解循环语句的场景与语法

场景:现在小朱同学要帮助标哥哥去搬砖,要搬10块,从第1块开始,搬完就可以吃饭。小朱因为力气比较小,一次只能搬1块砖。所以小朱搬砖就要搬10次

针对上面的场景,我们先要分析这几个数据

  1. 小朱从第1块开始搬
  2. 小朱一共要搬10块砖,没有达到10块就不能停止
  3. 小朱力气比较小,一次只能搬1块砖

在编程思想里面上面的过程可以使用我们循环语句来解决,现在我们就来使用for循环语句来完成。

for循环语句的语法格式如下

for(初始值;循环条件;自变量){
    //代码体
}

我们现在就通过这一种语法再结合上面的场景完成我们的代码,用编程思维解决小朱搬砖的问题

/*
	初始值:小朱是从第1块砖开始搬的,所以我们需要有一个初始值的变量保存小朱搬砖的数量
	循环条件:小朱一共要搬10块级,不搬完不能休息
	自变量:小朱力气比较小,每次只搬1块砖
*/
for(var i = 1;i <= 10;i = i + 1){
    console.log("小朱同学在搬砖,现在正在搬第"+i+"块");
}

for循环的本质

刚刚上面的for循环执行了10次,那么在循环执行的这10次里面,代码到底是怎么执行的呢?

通过断点分析,我们发现循环语句在执行的时候,它所循环执行的代码是下面三个部分

  1. 判断循环条件是否成立
  2. 执行代码体
  3. 自变量变化

现在根据这个循环语句的本质,我们可以画出如下的流程图

循环条件不成立循环条件成立break初始条件循环条件循环结束执行代码体自变量变化

根据上面的流程图,我们就可以充分和了解for循环是一种前测试循环语句

for循环的条件

经过上面的学习,我们都知道for循环的语法里面有三个值,分别是

  1. 初始值
  2. 循环条件
  3. 自变量

这三个条件共同决定了循环执行次数

🔥 场景一:小朱给标哥哥搬砖,要搬10块砖,之前已经搬了3块,现在要从第4块开始,每次搬1块,问小朱一共搬多少次?【改变了初始值】

for(var i =4 ;i <= 10;i++){
    console.log("小朱在搬第"+i+"块");
}

🔥 场景二:小朱给标哥哥搬砖,从第1块开始,要搬6块,每次搬一块,问小朱一共要搬多少次?【改变了结束条件】

for(var i=1;i<=6;i++){
     console.log("小朱在搬第"+i+"块");
}

🔥 场景三:小朱给标哥哥搬砖,从第1块开始,要搬10块砖,但是力大了每次可以搬2块,问小朱一共要搬多少?【改变了自变量的变化】

for(var i=1;i<=10;i+=2){
    console.log("小朱在搬第"+i+"块");
}

我们通过上面的三种场景可以得到一个结果,这三条件共同绝对了循环的执行次数

倒序的循环

循环不仅可以正着进行,不可以倒序来进行,如下所示

for(var i=10;i>=1;i--){
    console.log(i);
}

关于for循环里面的条件

for循环的语法格式我们已经知道了,那么里面的3个条件是否是必须的呢,我们来看一下

for(初始值;循环条件;自变量){
    //代码体
}

第一种情况:省略for循环里面的初始值

var i = 1;
for (; i <= 10; i++) {
    console.log("正在搬第" + i + "块砖");
}

在上面的代码里面,我们只是将这个初始值拿到外边去了

第二种情况:省略for循环里面的结束条件

for(var i=1;;i++){
    if(i>10){
        break;
    }
    console.log("正在搬第" + i + "块砖");
}

上面的代码里面,我们将循环的结束没有放在for里面,而是在代码体里面通过break结束了循环

第三种情况:省略自变量的变化

 for(var i=1;i<=10;){
     console.log("正在搬第" + i + "块砖");
     i++;
 }

在上面的代码里面,我们直接将这个自变量放在代码体里面,这样也没有违背我们的循环的本质,更没有违背代码的执行顺序

所以根据上面的特点,我们可以将for循环写成如下

var i = 1;
for(;;){
    if(i>10){
        break;
    }
    console.log("正在搬第" + i + "块砖");
    i++;
}

上面的for循环我们还可以这么写,我们将结束条件控制在for的关键字里面

var i = 1;
for(;i<=10;){
    console.log("正在搬第" + i + "块砖");
    i++;
}

while循环语句

while也是循环的一种方式,它也是一种前测试循环语句。它的for循环差不多,它的语法格式如下

while(循环条件){
    //代码体
}

我们可以将我们之前所学习的for循环转换成while循环,具体的循环可以从下面入手。

所有的循环应该都有三个条件

  1. 初始值
  2. 循环条件
  3. 自变量变化
//初始值
while(循环条件){
    //代码体
    
    //自变量
}

我们现在循环一个1~10的数

var i = 1;
while(i<=10){
    console.log("当前的数是"+i);
    i++;
}

while循环与for循环一样,也可以使用breakcontinue关键字

同时要注意,while的后面跟的是一个循环条件,这个条件不一定是布尔值,可以是任何类型的值。如下

var a = 123;
while(a){
    //这样是否可行呢???
}

如果while循环后面的条件不是布尔值,则通过Boolean()去转换一下


do…while循环语句

do…while属于后测试循环语句,先执行代码体,再判断条件是否成立,如果条件不成立,则不执行循环,所以 do…while的代码至少会执行一次,它的语法格式如下

//初始值可能会在外边
do{
    //代码体
    //自变量变化
}while(循环条件);

根据上面的语法,我们写一个do…while循环的代码

var i = 1;
do{
    console.log(i);
    i++;
}while(i<=10);

上面的代码就会显示1~10这10个数,它会执行时次

条件成立条件不成立初始值代码体自变量循环条件结束

到目前为止,我们已经讲了三种类型的循环语句

image-20200716150435909

break与continue

之前讲到循环的时候,我们知道循环的次数是由三个条件共同决定的,但是有没有特殊情况下,循环会停止呢?

正常的循环是当循环条件不萍踪的时候就会退出,但是在JS里面,仍然有两个关键字可以退出循环,这两个关键字就是breakcontinue

break与continue都是遵守就近原则

break的作用是中断最内部的循环,退出最内部的循环,后面的循环次数都不做的(半途而废)

continue的作用是跳过最内部后面的代码不去执行,继续下一次循环(浪子回头)

?案例:假设陈红搬10块砖,但是陈红说4这个数不吉利,我不搬,其它的我都可以搬,所以碰到4块砖它就不搬了,这怎么办呢?代码怎么写呢?

for (var i = 1; i <= 10; i++) {
    if(i===4){
        //说明现在搬的是第4块砖
        continue;		//跳过后面的代码体不去执行了,直接进入下一次循环
    }
    console.log("陈红在搬第" + i + "块砖");
}

?案例:假设陈红搬10块砖,但是中途到第4块砖的时候接到了她父的电话,说买彩票中了1000万,陈红喜出望外,一脚踹开了包工头,说:”老娘不干了,回家当富二代“。这个时候面种场景,应该怎么写代码呢?

for(var i=1;i<=10;i++){
    if(i===4){
        console.log("陈红接到父亲的电话,回去当富二代去了");
        break;
        //直接结束循环,中断循环,后面剩下的循环次数都不做了
    }
    console.log("陈红在搬第" + i + "块砖");
}

label语句

label语句一般适用 于语句的嵌套当中,请看下面的案例

for (var a = 1; a <= 3; a++) {
    console.log("这是第"+a+"次打印************");
    //这个for循环要复制3个 去执行
    for (var i = 1; i <= 5; i++) {
        if(i==3){
            break;
        }
        console.log("这是第" + i + "项");
    }
}

现在是两个循环发生了嵌套关系,如果内部的循环使用关键字breakcontinue,则就会有影响,上面的break离内循环近一些,所以它跳出的是内部的循环。那么如果我们想跳到外循环,这个时候就要借用于我们的label语句

outer:for (var a = 1; a <= 3; a++) {
    console.log("这是第"+a+"次打印************");
    //这个for循环要复制3个 去执行
    inner:for (var i = 1; i <= 5; i++) {
        if(i===3){
            break outer;  //它直接跳到了out的外循环
        }
        console.log("这是第" + i + "项");
    }
}

switch语句

switch 语句与 if 语句的关系最为密切,而且也是在其他语言中普遍使用的一种流控制语句。它也叫选择语句,它会选择符合条件的代码去执行,这个关键字会与case关键字结合起来一起使用

下面是switch的语法格式

switch(条件的值){
    case 条件1:
        //条件一的代码
        break;
    case 条件二:
        //条件二的代码
        break;
    //这里可能还有很多个case
    default:
        //所有条件都不满足的时候所执行的代码
        break;
}

它的语法格式与条件语句if的语法格式非常相像,都是通过一个条件来去执行某些代码

根据上面的语法格式,我们可以得出如下的代码案例

案列:现有一个天气的变量weather,根据这个变量,我们要做不同的操作,如果下雨,我们就在教室上课;如果下雪,我们就出去堆雪人;如果起风,我们就出去放风筝;如果是晴天,我们就去欢乐谷玩;如果都不是的,则考试。

首先使用if的语句去完成

var weather = "sun";
if (weather == "rain") {
    console.log("下雨了,我们就在教室里面上课");
} else if (weather == "snow") {
    console.log("下雪了,我们去堆雪人");
} else if (weather == "wind") {
    console.log("起风了,我们去放风筝");
} else if (weather == "sun") {
    console.log("大晴天,去欢乐谷");
} else {
    console.log("天气不合适,我们不玩了,去考试");
}

接下来再将上面的语句换成我们的switch…case语句

var weather = "sun";
switch (weather) {
    case "rain":
        console.log("下雨了,我们就在教室里面上课");
        break;
    case "snow":
        console.log("下雪了,我们去堆雪人");
        break;
    case "wind":
        console.log("起风了,我们去放风筝");
        break;
    case "sun":
        console.log("大晴天,去欢乐谷");
        break;
    default:
        console.log("天气不合适,我们不玩了,去考试");
        break;
}

上面两部分的代码执行的结果是一样的,所实现的功能也是一样的

switch语句注意事项

我们已经可以看到switch语句可以实现if的功能,那么它们有什么区别呢?

其次,为什么每个case语句的后面要加上break;不加可以吗?不加会有什么影响呢?

注意事项一:当case里面的条件相同的时候,怎么办呢?

var userRole = "teacher";
if (userRole == "teacher") {
    console.log("你是老师");
} else if (userRole == "student") {
    console.log("你是学生");
} else if (userRole == "teacher") {
    console.log("你是班主任");
} else {
    console.log("你是其它角色");
}

在上面的代码里在, 最终打印输出的代码是什么呢?

根据我们昨天讲过的else...if语句的特点,它会找到第一个符合要求的条件,然后执行代码,执行完毕以后就会退出,所以最终打印的结果就是“你是老师”

同样的原是,如果在switch...case里面出现了条件重复的情况呢?

var userRole = "teacher";
switch (userRole) {
    case "teacher":
        console.log("你是老师");
        break;
    case "student":
        console.log("你是学生");
        break;
    case "teacher":
        console.log("你是班主任");
        break;
    default:
        console.log("你是其它角色");
        break;
}

在上面的代码执行的时候,我们的case的条件也重复,但是它仍然只打印输出了“你是老师”,所以它也只选择了第一个条件执行,执行完毕以后就退了

switch…case语句里面的break

我们可以看到在每次书写switch...case语句的时候,里面的代码体当中都要添加一个break关键字,这个关键字的作用是什么呢?

var weather = "snow";
//使用swtich...case来完成
switch (weather) {
    case "rain":
        console.log("下雨了,我们就在教室里面上课");
    case "snow":
        console.log("下雪了,我们去堆雪人");
    case "wind":
        console.log("起风了,我们去放风筝");
    case "sun":
        console.log("大晴天,去欢乐谷");
    default:
        console.log("天气不合适,我们不玩了,去考试");
}

上面的代码我们就去掉了break,我们会看到,swtich会选择一个符合它的条件的case语句去执行,然后执行当前符合条件的代码以后,代码不会停止,它会继续向后面运行,所以上面的代码运行以后所打印输出的结果就是从snow的条件开始,一直到最后的 default

swtich在选择case的时候的操作,它是一个全等判断(===)操作

var score = "70";
switch (score) {
    case 90:
        console.log("嗯 ,不错,优秀");
        break;
    case 80:
        console.log("良好");
        break;
    case 70:
        console.log("中等");
        break;
    case 60:
        console.log("及格");
        break;
    default:
        console.log("其它的情况,没有找到条件");
        break;
}

在上在的代码里面,score="70"是一个字符串类型,而case的条件里面找不到字符串的"70",只有数字的70,所以它会执行default里面的代码

?案例一:现有一学生成绩变量score,要根据成绩的分数来划分等级,等级的划分如下

10090评定为优秀,8980评定为良好,7970评定为中等,6960评定为及格,否则就不及格。请使用你所知道的任何方法写出代码完成功能

//使用随机数成生了一个分数,判断这个分数的等级
var score = parseInt(Math.random() * 100);
switch (true) {
    case score >= 90 && score <= 100:
        console.log("优秀");
        break;
    case score >= 80 && score <= 89:
        console.log("良好");
        break;
    case score >= 70 && score <= 79:
        console.log("中等");
        break;
    case score >= 60 && score <= 69:
        console.log("及格");
        break;
    default:
        console.log("不及格");
        break;
}
console.log(score);

这个案例首先在 switch 语句外面声明了变量 score。而之所以给 switch 语句传递表达式 true,是因为每个 case 值都可返回一个布尔值。这样,每个 case 按照顺序被求值,直到找到匹配的值或者遇到 default 语句为止(这正是这个例子的最终结果)。

当然我们还可以 使用下面的方式去完成

var score = parseInt(Math.random() * 100);
switch (parseInt(score / 10)) {
    case 10:
    case 9:
        console.log("优秀");
        break;
    case 8:
        console.log("良好");
        break;
    case 7:
        console.log("中等");
        break;
    case 6:
        console.log("及格");
        break;
    default:
        console.log("不及格");
        break;
}
console.log(score);

?案例:一年有12个月,春天是2月,3月,4月,夏天,5月,6月,7月,8月,秋天,9月,10月,冬天11月,12月,1月,现在给定一个变量month,来判断这个月份属于什么季节

var month = parseInt(Math.random()*12)+1;		/*这会产生一个1~12之间的随机数*/	

第一种方式

var month = parseInt(Math.random() * 12) + 1;
switch (true) {
    case month == 2 || month == 3 || month == 4:
        console.log("春天");
        break;
    case month == 5 || month == 6 || month == 7 || month == 8:
        console.log("夏天");
        break;
    case month == 9 || month == 10:
        console.log("秋天");
        break;
    case month == 11 || month == 12 || month == 1:
        console.log("冬天");
        break;
    default:
        console.log("月份有错误");
        break;
}
console.log(month);

第二种方式

var month = parseInt(Math.random() * 12) + 1;
switch (month) {
    case 2:
    case 3:
    case 4:
        console.log("春天");
        break;
    case 5:
    case 6:
    case 7:
    case 8:
        console.log("夏天");
        break;
    case 9:
    case 10:
        console.log("秋天");
        break;
    case 11:
    case 12:
    case 1:
        console.log("冬天");
        break;
    default:
        console.log("月份有错误");
        break;
}
console.log(month);

案例与练习

  1. 一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米。

  2. 打印出100以内的素数。

  3. 百马百担问题,有100匹马,驮100担货,大马驮3担,中马驮2担,2匹小马驮1担,求大、中、小各多少匹?

  4. 有一对幼兔,幼兔1个月后长成小兔,小兔1个月后长成成兔并生下一对幼兔,问8个月后有多少对兔子,幼
    兔、小兔、成兔对数分别是多少。

  5. 羽毛球拍15元,球3元,水2元。200元每种至少一个,有多少可能?

  6. 括号里面只能放加或减,如果要使等式成立,括号里面应该放什么运算符
    12()34()56()78()9 = 59

  7. 打印出所有的水仙花数(提示:水仙花数的范围在111~999之间)
    水仙花是指一个三位数,它的每个位上的数字的3次幂之和等于它本身(例如:13 + 53 + 33 =153)

  8. 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下
    的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,
    见只剩下一个桃子了。求第一天共摘了多少?(提示:采用逆向思维的方向 ,从后向前推算)

  9. 有一个台阶,如果一次跨2个,则最后剩下1阶,如果一次跨3个,则最后剩下2阶,如果一次跨5个,则最后剩下4阶,如果一次跨6个,则最后剩下5阶,如果一次跨7个,则刚刚好跨完,请问这个台阶最少为多少阶。

  10. 有一篮球从5米高处自由落下,每次弹起的高度是上一次的1/3,当篮球弹起的高度小于0.1米以后就不再弹起了,请问,这个篮球会弹起多少次?

  11. 题目:日本某地发生了了起谋杀案,警察通过排查确定杀人凶手为4个嫌疑犯的一个,以下为四个嫌疑犯的供词

    A说:不是我

    B说:是C

    C说:是D

    D说:C在胡说

    已知三个人说了真话,一个人说了假话

  12. 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果

    A选手说:B第二,我第三。

    B选手说:我第二,E第四。

    C选手说:我第一,D第二。

    D选手说:C最后,我第三。

    E选手说:我第四,A第一。

    比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

  13. 填写数字 设有算式如图所示,求出口中的数字,并打印出完整的算式

clip_image001

  1. 分书问题

    有A、B、C、D、E五本书,要分给张、王、李、赵、钱五位同学,每人只能选一本,事先让每人把自己喜爱的书填于下表,编程找出让每个人都满意的方案。

    image-20200716150302024

  2. 猜测产品质量评奖 5家工厂的产品在一次评比中分获1,2,3,4,5,在公布结果前,已知E厂产品肯定不是第二、三名,五厂代表猜测评比结果,

    A厂的代表说:E厂一定能获得第一名。

    B厂的代表说:我厂的产品可能获第二名。

    C厂的代表说:A厂的产品质量最次。

    D厂的代表说:C厂的产品不是最好的。

    E厂的代表说:D厂的产品会获得第一名。

    公布结果后,证明只有产品获第一名和第二名的两个厂的代表猜对了。求5个厂产品各获第几名。

  3. 亲密数对 找出2—1000中的亲密数对。   亲密数对的定义:如果a的因子和等于b,b的因子和等于a,且a!=b则称a,b为亲密数对。

  4. 现有一个年月日,请算出它是当年的第多少天

    //"2020-7-17";
    var year1 = 2020;
    var month1= 7;
    var day1 = 17;
    //"2007-11-6";
    var year2 = 2007;
    var month2 = 7;
    var day2 = 17;
    
0

评论区