对于JS流程控制,与C语言的流程控制如出一辙。白龙网从顺序结构、分支结构、循环结构三个层面展开复习。顺序结构不用多数,按照先后顺序执行即可。宏观上说,分支结构有if分支、三元运算、switch语句等3种形式,重点是if分支语句,它又细分为单分支、双重分支和多重分支语句。循环语句就比较复杂一些,分别为for循环、while循环、do while循环,其中for循环又细分为单for循环,双重for循环,一般两重循环就能满足大部分需求。
1、顺序结构
1、顺序结构
按照代码的先后顺序,依次执行。
2、分支结构
根据不同的条件,执行不同的路径的代码,得到不同的结果。不管是单分支语句,还是多分支、多分支语句,执行结果只有一个。另外,else与if之间有一个空格,如果else表示结束,只有if后面可以跟花括号。
(1)if分支类型
①if单分支语句
<script>
if (条件表达式) {
//语句,当条件表达式为真时,执行花括号内语句;当条件表达式为假时,执行if后面的语句
}
</script>
案例:设置条件,只允许18岁以上的成年人可以访问网站。
<script>
var age = prompt('请输入您的年龄');
if (age >= 18) {
//
alert('欢迎访问白龙网');
}
</script>
②if双分支语句
<script>
if (条件表达式) {
//语句1,当条件表达式为真时,执行花括号内语句1;
} else {
//语句2,当条件表达式为假时,执行语句2;需要特别注意的是,else后面只能加花括号,不能加圆括号
}
</script>
案例1:年满18岁,方可上网
<script>
var age = prompt('请输入您的年龄');
if (age >= 18) {
//
alert('欢迎访问白龙网');
} else {
alert('未满18岁,禁止上网')
}
</script>
案例2:判断闰年、平年
<script>
var year = prompt('输入年份,查看闰年、平年');
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
alert('您输入的年份' + year +' 是闰年');
} else {
alert('您输入的年份' + year + '是平年');
}
</script>
案例3:中奖有奖,否则无奖
<script>
var prize = prompt('请输入中奖者姓名:');
if (prize == '刘德华') {
alert('恭喜您,中奖5元');
} else {
alert('很遗憾,您没有中奖,继续加油哦');
}
</script>
③if多分支语句
<script>
if (条件表达式) {
//语句1,当条件表达式为真时,执行花括号内语句1;
} else if{
//语句2,当条件表达式为假时,执行语句2;需要特别注意的是,else后面只能加花括号,不能加圆括号
} else if {
//语句3
} else {
//语句n,如果上面的条件都不满足,就执行最后一个
}
</script>
案例:根据学生成绩,打印对应评级
<script>
var score = prompt('请输入您的分数:');
if(score > 100) {
alert('满分100分,请输入有效分数');
} else if(score >= 90) {
alert('您的评分是:A');
} else if(score >=80) {
alert('您的评分是:B');
} else if(score >=70) {
alert('您的评分是:C');
} else if(score >= 60) {
alert('您的评分是:D');
} else if(score >= 0) {
alert('您的评分是:F');
} else if(score < 0) {
alert('请输入0~100之间的分数');
}
</script>
(2)三元表达式
三元表达式类似于双重分支语句,他是由三元运算符(?:)组成的式子
<script>
var num = 10;
var result = num > 6 ? '您说的对' : '不对';
console.log(result);//您说的对
</script>
案例:输入一个0~59之间的数字,如果小于10,就在数字前加个0,否则就正常输出这个数字。
<script>
var time = prompt('请输入0~59之间的数字')
var result = time < 10 ? '0' + time : time;
alert(result);
</script>
(3)switch语句
是多分支语句,也是多选一的语句,主要针对变量设置特定值。执行过程中,判断表达式的值是否与case后面的值匹配,如果匹配成功,则执行对应语句;否则就执行默认值。
表达式与CASE的值是全等,即===;baeak不能省略,如果没有break,当前语句不会退出switch,语句会按照顺序全部执行,直到遇到break;
switch(表达式) {
case value1: 语句1;break;
case value2: 语句2;break;
…………………………………………
default: 语句;
}
案例:表达式3与case3匹配,故而打印3。
<script>
var num = prompt('请输入数值:');
switch(parseInt(num)) {
case 1:
console.log('1');
break;
case 2:
console.log('2');
break;
case 3:
console.log('3');
break;
default:
console.log('没有查询到对应内容');
}
</script>
案例:查询水果的价格
<script>
var fruit = prompt('请输入水果名称:');
switch(fruit) {
case '苹果':
console.log(fruit + '的价格是10元/斤');
break;
case '香蕉':
console.log('香蕉的价格是2元/斤');
break;
default:
console.log('我们没有这种水果');
}
</script>
一般来说,switch case 语句与if else语句可以相互通用。
当case值为固定值时,建议使用switch,当表达式为判断时,建议用if else;
switch判断表达式后,直接跳转到case后面的语句,效率更高;if需要多次判断,效率相对低一些。
另外,当分支较少时,if语句比switch语句效率高,当分支较多时,switch语句比if语句效率高些。
案例:输入时间,显示问候语
<script>
var time = prompt('请输入时间点:');
if (time == '12点') {
alert('中午好');
} else if(time == '18点') {
alert('傍晚好');
} else {
alert('晚上好');
}
</script>
案例:比较大小并打印
<script>
var num1 = prompt('请输入一个数:');
var num2 =prompt('请再输入一个数:');
if (num1 > num2) {
alert(num1);
} else {
alert(num2);
}
</script>
案例:判断奇偶数并打印
<script>
var num = prompt('请输入一个数:');
if (num % 2 == 0) {
alert(num + '是一个偶数');
} else if (num % 2 != 0) {
alert(num + '是一个奇数')
}
</script>
案例:输入数字,显示对应星期
<script>
var num = prompt('请输入1!7的数字:');
switch(num) {
case '1':
alert('星期一');
break;
case '2':
alert('星期二');
break;
case '3':
alert('星期三');
break;
case '4':
alert('星期四');
break;
case '5':
alert('星期五');
break;
case '6':
alert('星期六');
break;
case '7':
alert('星期七');
break;
default:
alert('你输入的内容不合法')
}
</script>
案例: 根据钱的金额,提醒用户干点啥
<script>
var money = prompt('您猜班长有多少钱:');
if (money >= 2000) {
console.log('请大家吃西餐');
} else if (money >= 1500) {
console.log('请大家吃快餐');
} else if (money >= 1000) {
console.log('请大家喝饮料');
} else if(money >=500) {
console.log('请大家吃棒棒糖');
} else {
console.log('班长下次要把钱带够哦');
}
</script>
3、循环结构
循环的目的,是重复执行某些语句,通常跟计数有关。重复执行的部分叫循环体,是否重复执行,取决于循环条件,由循环终止条件和循环体组成的部分叫循环语句。
(1)for循环
①for循环
❶语法结构
for(初始化变量;条件表达式;操作表达式) {
//循环休
}
初始化变量:声明一个变量并赋值,这个变量通常作为计数器;
条件表达式:决定终止的条件;
操作表达式:主要是用来更新变量/计数器。
<script>
for (var i = 1; i < 5; i++) {
console.log('*');
}
</script>
❷执行过程
A.首先执行初始化变量,这个步骤只执行一次;
B.然后执行条件表达式,满足则继续往下执行;
C.其次执行循环体
D.接着执行操作表达式,此时先返回表达式原值i++=1,再加1i=2;
E.然后在条件表达式、循环体、操作表达式之间一直循环,直到条件终止。
❸断点调试
使用断点调试功能可以监控程序执行的整个过程与每个细节。使用方法是,检查->sources->目标代码左右数字上点击->刷新(就设置了断点)->下一步(查看程序执行的每一步)。
如果要取消断点,就在代码代码的数字上单击一下并刷新即可。
另外,可以在watch中添加变量,用来观察变量的变化。
❹循环执行相同的代码
设置一个变量,让用户控制循环打印相同内容的次数
<script>
var num = prompt('请输入循环执行的次数:');
for (var i = 1; i <= num; i++) {
console.log('白龙网');
}
</script>
❺循环执行不同的代码
案例:仅仅for循环执行不同的代码
<script>
for(var i = 1; i <= 100; i++) {
console.log('白龙网已经上线' + i + '年了');
}
</script>
案例:嵌套分支语句循环执行不同的代码,这里要注意的是条件表达式中要用比较运算符 ==
<script>
for(var i = 1; i <= 100; i++) {
if(i == 1) {
console.log('白龙网刚刚上线,有待于继续更新');
} else if (i == 100) {
console.log('哇,白龙网已经发展成为100年网站了');
} else {
console.log('白龙网是个' + i + '年的好网站');
}
}
</script>
❻重复执行某些操作:计算1~100之间所有数的和与所有数的平均值
<script>
var sum = 0;
for (var i = 1; i <= 100; i++) {
sum += i;
}
console.log('总和=' + sum);
console.log('平均值=' + sum/100);
</script>
案例a:求出1~100之间所有偶数之和与奇数之和
<script>
var even = 0,odd = 0,sum = 0;
for(var i = 0; i <= 100; i++) {
if(i % 2 ==0) {
even += i;
} else {
odd += i;
}
}
sum = even + odd;
console.log('1-100之间的偶数之和是:' + even);
console.log('1-100之间的奇数之和是:' + odd);
console.log('1-100之间的奇偶数之和是:' + sum);
</script>
案例b:1-100之间能被3整除的数之和
<script>
var sum = 0;
for (var i = 1; i <= 100; i++) {
if (i % 3 == 0){
sum += i;
}
}
console.log('1-100之间能被3整除的数之和是:' + sum);
</script>
案例c:根据班级人数,输入学生成绩,并打印成绩总和,求出成绩平均值,这里的技巧在于输入一个人数用一个语句表示,而输入多个成绩则用循环来写,另外,prompt接收的数据是字符型,要转换为数字型。
<script>
var num = prompt('请输入班级人数:');
var sum = 0;
var average = 0;
for (var i = 1; i <= num; i++) {
var score = prompt('请输入第' + i + '个成绩');
sum = sum +parseFloat(score);
}
// alert('成绩总和为:' + sum);
average = sum/num;
console.log('成绩之各为:' + sum);
console.log('平均成绩为:' + average);
</script>
案例d:打印一行5个五角星,这里两个难点:一是定义一个空字符串,单引号内一定要加空格;二是使用追加、拼接字符串的的方法把星星放到同一行。
<script>
var str = ' ';
for (var i = 1; i <= 6; i++) {
str = str + '★';
}
console.log(str);
</script>
②双重for循环
双重for循环,是两个for循环嵌套在一块,内层循环本质上是一个语句。具体执行而言,外层循环一次,内层全部循环。如下例:
<script>
for (var i = 1; i <= 3; i++) {
console.log('A这是外层第' + i + '次循环');
for (var j = 1; j <= 3; j++) {
console.log('这是内层第' + j + '次循环');
}
}
</script>
案例:打印5行5列的星星,有3个点需要注意,一是内循环负责一行星星的打印,二是外循环负责打印5行星星,即:行数,并且每打印一行,就输出一个回车换行。
<script>
var str = '';
for (var i = 1; i <= 3; i++) {
for (var j = 1; j <= 3; j++) {
str += '★';
}
str += ' ';
}
console.log(str);
</script>
案例:倒三角形打印,循环负责行数,内循环负责一行打印的星星内容
<script>
var str = '';
for (var i = 1; i <= 10; i++) {
for (var j = i; j <= 10; j++) {
str += '★';
}
str += ' ';
}
console.log(str);
</script>
案例:打印正三角形
<script>
var str = '';
for (var i = 1; i <= 10; i++) {
for (var j = 11 - i; j <= 10; j++) {
str += '★';
}
str += ' ';
}
console.log(str);
</script>
案例:乘法口决表,这个算法的核心是每一行元素个数小于等于行号,即:j<=i;然后根据1X1=1这个算式,结合其与行号、元素数的关系,转换成代码即可。
可以简单的理解成,先打印一个三角形的图片,然后把每行中元素修改成公式即可。
<script>
var str = '';
for (var i = 1; i <= 9; i++) {
for (var j = 1; j <= i; j++) {
// 1 X 2 =2
str += j + 'x' + i + '=' + i*j + ' ';
}
str += ' ';
}
console.log(str);
</script>
(2)while循环
while语句,其实与for循环一样,有初始化变量,有判断表达式(为真时,执行循环休,为假时,退出循环休),计数器。如果没有计数器,会进入死循环。
<script>
var num = 1;
while (num <= 100) {
console.log(num);
num++;
}
</script>
案例:不满足条件,会一直执行下去
<script>
var message = prompt('');
while(message !== '我爱你') {
message = prompt('你爱我吗?');
}
alert('我也爱你哟');
</script>
(3)do while循环
do while与while一样,都要有初始变量,计数器,条件表达式;与while不同的是,do while是先执行一次循环体之后,再判断条件,当条件不满足时,就退出循环。
<script>
var i = 1;
do {
console.log(i);
i++;
} while (i <= 100);
</script>
三个循环语句是可以相互替换使用的;与次数有关,一般用for;更复杂的判断可以使用while或者do while。而while与do while的主要区别是谁先执行的事儿。
(4)continue与break
①continue 退出当前循环,直接跳转到++,继续下一轮循环,如下例,共执行4次,而第3次没有打印
<script>
for (var i =1; i <= 5; i++) {
if (i == 3) {
continue;
}
console.log('这是第' + i + '次输出');
}
</script>
②break 退出整个循环,剩下的程序不再执行了,如下例,程序仅执行了2次
<script>
for (var i =1; i <= 5; i++) {
if (i == 3) {
break;
}
console.log('这是第' + i + '次输出');
}
</script>
案例:求1~100内非7倍数的数之和
<script>
var sum = 0;
for (var i = 1; i <= 100; i++) {
while (i % 7 != 0) {
sum += i;
i++;
}
}
console.log(sum);
</script>
案例:判断输入的用户名、密码是否正确,正确则弹出登陆成功,错误则要求一直输入用户名,密码。
<script>
var user = prompt('请输入用户名:');
var psd = prompt('请输入密码:');
while (user == 'admin' && psd == '123456') {
alert('登陆成功');
break;
}
while (user != 'admin' && psd != '123456') {
user = prompt('请输入用户名:');
psd = prompt('请输入密码:');
}
</script>
案例:模拟简单的ATM机
<script>
num = prompt('存钱请输入1 取钱请输入2 查询请输入3 退出请输入4');
var money = 100;
var save = 0;
switch (num) {
case '1':
save = prompt('请输入存钱金额:');
money += parseFloat(save);
alert('您存入金额是' + save + '元 您帐户余额是' + money + '元');
prompt('存钱请输入1 取钱请输入2 查询请输入3 退出请输入4');
break;
case '2':
draw = prompt('请输入取钱金额:');
if (parseFloat(draw) > money) {
prompt('余额不足,请重新输入 取钱请输入1 存钱请输入2 查询请输入3 退出请输入4');
} else {
money -= parseFloat(draw);
alert('取款成功,帐户余额' + money + '元');
prompt('存钱请输入1 取钱请输入2 查询请输入3 退出请输入4');
}
break;
case '3':
alert('当前余额为' +money + '元');
break;
prompt('存钱请输入1 取钱请输入2 查询请输入3 退出请输入4');
case '4':
alert('欢迎下次光临');
break;
}
</script>