语句
语句是ECMAScript
编程的基本单位,所有的程序都是由语句来构成的。同时语句我们可以按功能来分类,语句也叫流程控制语句
ECMA-262 规定了一组语句(也称为流控制语句)。从本质上看,语句定义了 ECMAScript 中的主要语法,语句通常使用一或多个关键字来完成给定任务。语句可以很简单,例如通知函数退出;也可以比较复杂,例如指定重复执行某个命令的次数。
if语句
if语句也叫条件语句/分支语句,它是根据某一个条件来执行相应的代码,控制代码的流程走向。它使用的关键是if
与else
它的语法格式如下
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块开始搬
- 小朱一共要搬10块砖,没有达到10块就不能停止
- 小朱力气比较小,一次只能搬1块砖
在编程思想里面上面的过程可以使用我们循环语句来解决,现在我们就来使用for循环语句来完成。
for循环语句的语法格式如下
for(初始值;循环条件;自变量){
//代码体
}
我们现在就通过这一种语法再结合上面的场景完成我们的代码,用编程思维解决小朱搬砖的问题
/*
初始值:小朱是从第1块砖开始搬的,所以我们需要有一个初始值的变量保存小朱搬砖的数量
循环条件:小朱一共要搬10块级,不搬完不能休息
自变量:小朱力气比较小,每次只搬1块砖
*/
for(var i = 1;i <= 10;i = i + 1){
console.log("小朱同学在搬砖,现在正在搬第"+i+"块");
}
for循环的本质
刚刚上面的for循环执行了10次,那么在循环执行的这10次里面,代码到底是怎么执行的呢?
通过断点分析,我们发现循环语句在执行的时候,它所循环执行的代码是下面三个部分
- 判断循环条件是否成立
- 执行代码体
- 自变量变化
现在根据这个循环语句的本质,我们可以画出如下的流程图
根据上面的流程图,我们就可以充分和了解for循环是一种前测试循环语句
for循环的条件
经过上面的学习,我们都知道for
循环的语法里面有三个值,分别是
- 初始值
- 循环条件
- 自变量
这三个条件共同决定了循环执行次数
🔥 场景一:小朱给标哥哥搬砖,要搬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循环,具体的循环可以从下面入手。
所有的循环应该都有三个条件
- 初始值
- 循环条件
- 自变量变化
//初始值
while(循环条件){
//代码体
//自变量
}
我们现在循环一个1~10的数
var i = 1;
while(i<=10){
console.log("当前的数是"+i);
i++;
}
while循环与for循环一样,也可以使用
break
和continue
关键字
同时要注意,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个数,它会执行时次
到目前为止,我们已经讲了三种类型的循环语句
break与continue
之前讲到循环的时候,我们知道循环的次数是由三个条件共同决定的,但是有没有特殊情况下,循环会停止呢?
正常的循环是当循环条件不萍踪的时候就会退出,但是在JS里面,仍然有两个关键字可以退出循环,这两个关键字就是break
与continue
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 + "项");
}
}
现在是两个循环发生了嵌套关系,如果内部的循环使用关键字break
或continue
,则就会有影响,上面的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);
案例与练习
-
一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米。
-
打印出100以内的素数。
-
百马百担问题,有100匹马,驮100担货,大马驮3担,中马驮2担,2匹小马驮1担,求大、中、小各多少匹?
-
有一对幼兔,幼兔1个月后长成小兔,小兔1个月后长成成兔并生下一对幼兔,问8个月后有多少对兔子,幼
兔、小兔、成兔对数分别是多少。 -
羽毛球拍15元,球3元,水2元。200元每种至少一个,有多少可能?
-
括号里面只能放加或减,如果要使等式成立,括号里面应该放什么运算符
12()34()56()78()9 = 59 -
打印出所有的水仙花数(提示:水仙花数的范围在111~999之间)
水仙花是指一个三位数,它的每个位上的数字的3次幂之和等于它本身(例如:13 + 53 + 33 =153) -
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下
的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,
见只剩下一个桃子了。求第一天共摘了多少?(提示:采用逆向思维的方向 ,从后向前推算) -
有一个台阶,如果一次跨2个,则最后剩下1阶,如果一次跨3个,则最后剩下2阶,如果一次跨5个,则最后剩下4阶,如果一次跨6个,则最后剩下5阶,如果一次跨7个,则刚刚好跨完,请问这个台阶最少为多少阶。
-
有一篮球从5米高处自由落下,每次弹起的高度是上一次的1/3,当篮球弹起的高度小于0.1米以后就不再弹起了,请问,这个篮球会弹起多少次?
-
题目:日本某地发生了了起谋杀案,警察通过排查确定杀人凶手为4个嫌疑犯的一个,以下为四个嫌疑犯的供词
A说:不是我
B说:是C
C说:是D
D说:C在胡说
已知三个人说了真话,一个人说了假话
-
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三。
B选手说:我第二,E第四。
C选手说:我第一,D第二。
D选手说:C最后,我第三。
E选手说:我第四,A第一。
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
-
填写数字 设有算式如图所示,求出口中的数字,并打印出完整的算式
-
分书问题
有A、B、C、D、E五本书,要分给张、王、李、赵、钱五位同学,每人只能选一本,事先让每人把自己喜爱的书填于下表,编程找出让每个人都满意的方案。
-
猜测产品质量评奖 5家工厂的产品在一次评比中分获1,2,3,4,5,在公布结果前,已知E厂产品肯定不是第二、三名,五厂代表猜测评比结果,
A厂的代表说:E厂一定能获得第一名。
B厂的代表说:我厂的产品可能获第二名。
C厂的代表说:A厂的产品质量最次。
D厂的代表说:C厂的产品不是最好的。
E厂的代表说:D厂的产品会获得第一名。
公布结果后,证明只有产品获第一名和第二名的两个厂的代表猜对了。求5个厂产品各获第几名。
-
亲密数对 找出2—1000中的亲密数对。 亲密数对的定义:如果a的因子和等于b,b的因子和等于a,且a!=b则称a,b为亲密数对。
-
现有一个年月日,请算出它是当年的第多少天
//"2020-7-17"; var year1 = 2020; var month1= 7; var day1 = 17; //"2007-11-6"; var year2 = 2007; var month2 = 7; var day2 = 17;
评论区