【JS从入门到精通】04-流程控制
流程控制
1、流程控制语句
所谓流程控制就是指“程序怎么执行”或者说“程序执行的顺序。
JS中的程序是从上到下一行一行执行的
通过流程控制语句可以控制程序执行流程,使程序可以根据一定的条件来选择执行
1.1程序的三种基本结构
-
按照顺序一条一条执行,从上至下,逐行执行
-
分支结构
执行的时候,可以根据条件进行选择,条件越多对应的结果越多,分支也就越多 。
其中,包括 if...else if...else...语句,switch语句
-
循环结构
重复的做一件事情,如果不给条件,就会无限执行, 可以限制重复的次数 。
其中,包括 for循环,for...in循环,while循环,do while循环等;
2、
使用条件判断语句,可以在执行某个语句之前进行判断
如果条件成立才会执行语句,条件不成立则语句不执行。
2.1 if 语句
语法一
if(条件表达式) {
语句
}
if
语句在执行时,会先对条件表达式进行求值判断
- 如果条件表达式的值为
true
,则执行if
后的语句 - 如果条件表达式的值为
false
,则不执行if
后的语句
if
语句只能控制紧随其后的那个语句,如果希望if
语句可以控制多条语句,可以将这些语句统一放到代码块中
if
语句后的代码块不是必须的,但是在开发中尽量写上代码块,即使if
后只有一条语句
2.2
语法二
if(条件表达式) {
语句1...
} else {
语句2...
}
if...else...
语句执行时,会先对if
后的条件表达式进行求值判断
- 如果该值为
true
,则执行if
后的语句 - 如果该值为
false
,则执行else
后的语句
2.3
语法三
if(条件表达式) {
语句1...
} else if(条件表达式) {
语句2...
} else if(条件表达式) {
语句3...
} else{
语句4...
}
if...else if...else
语句执行时,会从上到下依次对条件表达式进行求值判断
- 如果值为
true
,则执行当前语句 - 如果值为
false
,则继续向下判断 - 如果所有的条件都不满足,则执行最后一个
else
后的语句 - 该语句中,只会有一个代码块被执行,一旦代码块执行了,则直接结束语句
练习
prompt()
可以弹出一个提示框,该提示框中会带有一个文本框,用户可以在文本框中输入一段内容
该函数需要一个字符串作为参数,该字符串将会作为提示框的提示文字
用户输入的内容将会作为函数的返回值返回,可以定义一个变量来接收该内容
// 练习1
// 从键盘输入小明的期末成绩:
// 当成绩为100时,’奖励一辆BMW’
// 当成绩为[80-99]时,’奖励一台iphone15s'
// 当成绩为[60-80]时,’奖励一本参考书’
// 其他时,什么奖励也没有
var score = prompt("请输入小明的期末成绩:");
if(score == 100){
alert("奖励一辆BMW");
} else if(score >80 && score <= 99){
alert("奖励一台iphone15s");
} else if(score >60 && score <= 80){
alert("奖励一本参考书");
} else{
alert("什么奖励也没有");
}
// 练习2
// 大家都知道,男大当婚,女大当嫁。那么女方家长要嫁女儿,当然要提出一定的条件:
// 高:180cm以上;富:1000万以上;帅:500以上;如果这三个条件同时满足,则:’我一定要嫁给他’
// 如果三个条件有为真的情况,则:’嫁吧,比上不足,比下有余。’
// 如果三个条件都不满足,则:’不嫁!’
// 练习3
// 编写程序,由键盘输入三个整数分别存入变量num1、num2、num3,对他们进行排序,并且从小到大输出。
其他练习,大家可以自己尝试做下。练习2还是很简单的,跟练习1差不多,无非就是多了几次输入。练习3的话,如果你是初学编程的话,可以尝试做一做,不过个人感觉可以在学完for
循环之后再做,而且这个应该当做简单的算法题。
2.4
switch(条件表达式) {
case 表达式1:
语句1...;
break;
case 表达式2:
语句2...;
break;
default:
语句...;
break;
}
switch...case..
语句
在执行时会依次将case
后的表达式的值和switch
后的条件表达式的值进行全等比较
- 如果比较结果为
true
,则从当前case
处开始执行代码。当前case
后的所有的代码都会执行,我们可以在case
的后边跟着一个break
关键字,这样可以确保只会执行当前case
后的语句,而不会执行其他的case
- 如果比较结果为
false
,则继续向下比较 - 如果所有的比较结果都为
false
,则只执行default
后的语句
switch
语句和if
语句的功能实际上有重复的,使用switch
可以实现if
的功能,同样使用if
也可以实现switch
的功能,所以我们使用时,可以根据自己的习惯选择
// 对于成绩大于60分的,输出’合格’。低于60分的,输出’不合格’
var score = prompt("请输入成绩:");
var tmp = parseInt(score/10);
switch (tmp){
case 10:
case 9:
case 8:
case 7:
case 6:
alert("合格");
break;
default:
alert("不合格");
break;
}
2.5 js中if和switch该如何选择?
if 和 switch 都可以设计多重分支结构,一般情况下 switch 执行效率要高于 if 语句。
但是也不能一概而论,应根据具体问题具体分析。简单比较如表所示。
相对而言,下面情况更事宜选用 switch 语句。
-
枚举表达式的值。这种枚举是可以期望的、平行的逻辑关系。
-
表达式的值具有离散性,是不具有线性的非连续的区间值。
-
表达式的值是固定的,不会动态变化。
-
表达式的值是有限的,不是无限的,一般应该比较少。
-
表达式的值一般为整数、字符串等简单的值。
下面情况更事宜用 if 语句。
-
具有复杂的逻辑关系。
-
表达式的值具有线性特征,去对连续的区间值进行判断。
-
表达式的值是动态的。
-
测试任意类型的数据。
3、
3.1 while 语句
循环语句:通过循环语句可以反复的执行一段代码多次
while
循环语法:
while(条件表达式) {
语句...
}
while
语句在执行时,先对条件表达式进行求值判断
- 如果值为
true
,则执行循环体,循环体执行完毕以后,继续对表达式进行判断 - 如果为
true
,则继续执行循环体,以此类推 - 如果值为
false
,则终止循环
var a = 0;
while(true) {
alert(a++);
}
像这种将条件表达式为true
的循环,叫做死循环
该循环不会停止,除非浏览器关闭,死循环在开发中慎用。可以使用break
,来终止循环
var i = 0;
while(true){
document.write(i++ + "<br/>");
if(i > 10){
break;
}
}
创建一个循环,往往需要三个步骤:
- 创初始化一个变量
- 在循环中设置一个条件表达式
- 定义一个更新表达式,每次更新初始化变量
// 1.创初始化一个变量
var i = 0;
// 2.在循环中设置一个条件表达式
while(i < 10){
// 3.定义一个更新表达式,每次更新初始化变量
document.write(i++ + "<br/>");
}
练习
// 假如投资的年利率为5%,试求从1000块增长到5000块,需要花费多少年
var money = 1000;
var year = 0;
while(money < 5000){
money *= 1 + 0.05;
year++;
}
alert("需要花费" + year + "年");
3.2 do-while 语句
do...while
循环语法:
do{
语句...
}while(条件表达式)
do...while
语句在执行时,会先执行循环体,循环体执行完毕以后,在对while
后的条件表达式进行判断
- 如果结果为
true
,则继续执行循环体,执行完毕继续判断,以此类推 - 如果结果为
false
,则终止循环
实际上这两个语句功能类似,不同的是
while
是先判断后执行,而do...while
会先执行后判断do...while
可以保证循环体至少执行一次,而while
不能
3.3 for 语句
for
语句,也是一个循环语句,也称为for
循环
在for
循环中,为我们提供了专门的位置用来放三个表达式:
- 初始化表达式
- 条件表达式
- 更新表达式
for循环的语法:
for(①初始化表达式;②条件表达式;③更新表达式) {
④语句...
}
for
循环的执行流程:
- ①执行初始化表达式,初始化变量(初始化表达式只会执行一次)
- ②执行条件表达式,判断是否执行循环。
- 如果为
true
,则执行④语句 - 如果为
false
,则终止循环
- 如果为
- ③执行更新表达式,更新表达式执行完毕,继续重复②
for
循环中的三个部分都可以省略,也可以写在外部
如果在for
循环中不写任何的表达式,只写两个;
,此时循环是一个死循环会一直执行下去,慎用
for(;;){
alert("hello");
}
练习
// 练习1、打印1-100之间所有奇数之和
for(i=1,result=0;i<=100;i++){
if(i%2 == 1){
result += i;
}
}
console.log('result='+result);
// 练习2、打印1-100之间所有7的倍数的个数及总和
for(i=1,result=0,count=0;i<=100;i++){
if(i%7 == 0){
result += i;
count++;
}
}
console.log('个数='+count+',总和='+result);
// 练习3、水仙花数
// 水仙花数是指一个3位数,它的每个位上的数字的3次幂之和等于它本身。
// (例如:1^3+5^3+3^3=153),请打印所有的水仙花数。
var hundreds_place;
var tens_place;
var ones_place;
for(i=100;i<1000;i++){
hundreds_place = parseInt(i/100);
tens_place = parseInt(i/10) - parseInt(hundreds_place*10);
ones_place = i % 10;
if(i == (hundreds_place*hundreds_place*hundreds_place
+ tens_place*tens_place*tens_place
+ ones_place*ones_place*ones_place)){
console.log(i);
}
}
// 练习4、在页面中接收一个用户输入的数字,并判断该数是否是质数。
// 质数:只能被1和它自身整除的数,1不是质数也不是合数,质数必须是大于1的自然数。
var num = prompt("请输入一个数字:");
while(isNaN(num)){
num = prompt("请输入一个数字:");
}
flag = true;
for(j=2;j<num;j++){
if(num%j==0){
flag = false;
break;
}
}
if(flag){
alert(num + "是质数");
} else{
alert(num + "不是质数");
}
// 练习5、通过程序,在页面中输出如下的图形:
//*
//**
//***
//****
//*****
// 通过一个for循环来输出图形
// 这个for循环执行几次,图形的高度就是多少
// 它可以用来控制图形的高度
for(i=0;i<5;i++){
// 在循环的内部再创建一个循环,用来控制图形的宽度
// 目前我们的外部的for循环执行1次,内部的就会执行5次
// 内层循环可以来决定图形的宽度,执行几次图形的宽度就是多少
for(j=0;j<=i;j++){
document.write("*");
}
document.write("<br/>");
}
// *****
// ****
// ***
// **
// *
for(i=0;i<5;i++){
for(j=0;j<5-i;j++){
document.write("*");
}
document.write("<br/>");
}
// 练习6、九九乘法表
for(i=1;i<10;i++){
for(j=1;j<=i;j++){
document.write(j + "×" + i + "=" + i*j + "\t");
}
document.write("<br/>");
document.write("<br/>");
}
// 练习7、打印出1~100之间的所有质数
var flag = true;
for(i=2;i<=100;i++){
flag = true;
for(j=2;j<i;j++){
if(i%j==0){
flag = false;
break;
}
}
if(flag){
console.log(i);
}
}
// 质数性能优化
console.time("test");
var flag;
for(i=2;i<=100000;i++){
flag = true;
for(j=2;j<=i/Math.sqrt(i);j++){
if(i%j==0){
flag = false;
break;
}
}
if(flag){
// console.log(i);
}
}
console.timeEnd("test");
3.4
键名:键值(键名键值一一对应)
var obj = {a:1,b:2}
for(var key in 对象){
console.log(key); //对象的键名(属性名) a b
console.log(对象[key]); //对象的键值(属性值)1 2
//console.log(对象."a"); //错误的语法
}
4、
不能在if
语句中使用break
和continue
break
break
关键字可以用来退出switch
或循环语句break
关键字,会立即终止离他最近的那个循环语句
可以为循环语句创建一个label
,来标识当前的循环label
:
循环语句使用break
语句时,可以在break
后跟着一个label
,这样break
将会结束指定的循环,而不是最近的
练习1:for循环遍历范围是1到10,遍历的时候只想打印到3.
<script>
for ( var i=0 ; i<5 ; i++ ) {
if ( i == 3 ) {
break;
}
console.log(i);
}
</script>
思考:break只能跳出最内层的循环,那么如果有多层的循环,怎么跳出指定哪层或者最外层的for循环?
练习2:两层for循环嵌套,每一个都打印0到9,最终打印5,5。
<script>
outermost:
for(var i=0; i<10;i++){
for(var j=0; j<10; j++){
if(i==5 && j==5){
break outermost;
}
}
}
console.log(i,j);
</script>
continue
continue
关键字可以用来跳过当次循环continue
也是默认只会对离他最近的循环循环起作用练习1:遍历0到4的过程中,如果遇到3则跳过。
<script> for ( var i=0 ; i<5 ; i++ ) { if ( i == 3 ) { continue; } console.log(i); } </script>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix