3.6.流程控制/逻辑结构
程序 = 数据 + 算法
程序分为:顺序执行、选择执行、循环执行
1.选择执行
(1)if语句
if(条件表达式){ 语句1; }
|
PS: 条件表达式为true,执行语句1
PS:在条件表达式中,有一些值会默认转成false,通常和 !一起使用 0 '' null NaN undefined ps:如果if后的大括号中只有一行语句,可以省略大括号。
|
//满30减12 var a=35; if(a>=30){ a-=12; } console.log(a); // 省略大括号 if(a>=30) a-=12; console.log(a); |
//练习:声明变量保存个人签名,如果签名内容为空,给变量赋值‘这个家伙很懒,什么都没有留下’;最后打印变量 var str=''; if (!str){ // str的值是false str='这个家伙很懒,什么都没有留下'; } console.log(str); |
PS:在条件表达式中,有一些值会默认转成false,通常和 !一起使用
0 '' null NaN undefined
(2)if-else 语句
if(条件表达式){ 语句1; }else{ 语句2; } |
Ps1: 条件表达式为true,执行语句1 条件表达式为false,执行语句2
ps:如果if或者else后面只有一行语句,后面的大括号的省略 |
//如果余额足够支付订单金额,支付成功,否则支付失败 var money=67; //余额 var total=70; //订单金额 if (money>=total){ console.log('支付成功'); }else{ console.log('支付失败'); } |
//练习:使用弹出提示框分别输入商品的单价和数量,如果商品的总价满500,则打八折;假如当前卡内的余额为600,如果足够支付总价,打印pay success,否则打印pay error。 var money=600; var price=prompt('请您输入单价');//20 var num=prompt('请您输入数量');//30 var sum=price*num; // (*)乘法隐式转换数据类型 //console.log(sum); if(sum>=500){ sum*=0.8; //480 } if(sum<=money){ alert('支付成功——pay cuccess'); }else{ alert('支付失败——pay error'); } |
(3)if-else 嵌套 用于判断多种情况
if(条件表达式1){ 语句1; }else if(条件表达式2){ 语句2; }else...if(条件表达式n){ 语句n; }else{ 语句n+1; //以上所有的条件表达式都是false } |
//判断一个人的政治面貌 var type='群众元'; if (type=='党员'){ console.log('此人为党员'); }else if(type=='共青团员'){ console.log('此人为共青团员'); }else if(type=='群众'){ console.log('此人为群众'); }else { console.log('非规范政治面貌'); } |
(4)switch-case 语句
PS:是一种特殊的分支语句,根据表达式的值,选择执行不同的程序
switch(表达式){ case 值1: //如果表达式的值为值1 语句1; break; case 值2: 语句2; break; ... case 值n: 语句n; break; default: 语句n+1; //以上所有的结果都是false } |
//练习,根据订单的状态码来打印对应的中文 //1-等待付款 2-等待发货 3-运输中 4- 已签收 5-已取消 其它-错误的状态码 var status=1; switch (status){ case 1: console.log('1-等待付款'); break; case 2: console.log('2-等待发货'); break; case 3: console.log('3-运输中'); break; case 4: console.log('4- 已签收'); break; case 5: console.log('5-已取消'); break; default: console.log('其它-错误的状态码'); } |
注意:在case中表达式和值在比较的时候使用的是全等于(===),要求值和类型都满足结果才是true
对比if-else嵌套和switch-case语句
|
if-else |
switch-case |
相同点 |
两者都可以用于多项分支语句 |
|
不同点 |
可以判断相等或者不等的情况,使用范围更广 |
只能用于全等于(===)的情况,结构上更为清晰合理,执行效率更高。 |
(2)练习:
使用switch-case来根据成绩判断标准 原理:让分数除以10,然后取整
var score=92; switch(parseInt(score/10)){ // 9.2 -> 9 case 10: //两个case共用一个语句 case 9: console.log('优秀');break; case 8: console.log('良好');break; case 7: console.log('中等');break; case 6: console.log('及格');break; default: conaole.log('不及格'); } |
2. 循环执行
循环:就是一遍又一遍执行相同或者相似的代码
循环的两个要素:
循环的条件:控制循环的次数
循环体:重复执行的相同或者相似代码
(1)while 循环
while(循环条件){ //结果是布尔型的值 循环体 } |
var i=1; while(i<10){ console.log(i); i++ } |
break 关键字 可以结束任何形式的循环,break执行后,后边所有的循环体和循环条件都不执行
练习:使用变量保存一个数字,无限循环弹出提示框,获取输入的值,用输入的值和保存的数字比较,如果猜大了,弹出警示框'big',如果猜小了,弹出警示框'small',否则弹出警示框 'right'。 var num=25; while(true){ //无限循环弹出提示框 var str=prompt('输入一个数字'); if(str>num){ alert('猜大了'); }else if(str<num){ alert('猜小了'); }else{ alert('恭喜你,猜对了'); break; } } |
(2)do-while 循环
do{ 循环体; }while(循环条件); |
先执行循环体,在执行循环条件,
循环条件是false时结束循环 |
var i=1; do{ console.log(i); i++; }while(i<=10); |
ps:不管循环条件是否为true,都会执行一次循环体
练习:打印100~1之间所有的整数 |
练习:打印70 75 80 85 90 95 100 |
练习:计算1~100之间所有能被3整除的数字的和 |
练习:计算10的阶乘 |
练习:声明一个变量保存密码'123456',无限循环弹出提示框,在提示框中输入密码,如果输入正确,结束循环。 |
|
var i=100; do{ console.log(i); i--; }while(i>=1); |
var i=70; do{ console.log(i); i+=5; } while (i<=100); |
var i=1,sum=0; do{ if(i%3==0){ sum+=i; } i++; }while (i<=100); console.log(sum); |
var ride=1,i=10; do{ ride*=i; i--; }while(i>=1) console.log(ride); |
var pwd='123456'; do{ var input=prompt('请输入密码:'); if(input==pwd){ alert('恭喜你输入成功'); break; } }while(true); |
var pwd='123456'; do{ var input=prompt('请输入密码:'); }while(input!=pwd); //如果输入的密码不正确继续执行循环体 alert('恭喜你输入成功'); |
(3)for 循环
for(初始值; 循环条件; 循环的增量){ 循环体 }
|
PS:1.执行初始值 2.判断循环条件 3.如果循环条件是true执行循环体,false结束循环 4.如果执行完循环体,执行增量 5.重新执行第二步 |
如果有多个循环条件,后边的起作用
练习:打印80 77 74 71 ....50 |
练习:1-20之间偶数的乘积 |
练习:打印本世纪(2000~2100)所有的闰年, |
练习:计算1/10+2/9+3/8...+10/1 |
for(var i=80;i>+50;i=i-3){ console.log(i); } |
for(var i=1,ride=1;i<=20;i++){ if(i%2==0){ ride*=i; } } console.log(ride); |
for(var i=2000;i<=2100;i++){ if((i%4==0 && i%100!=0 )|| i%400==0){ console.log(i); } } |
for(var i=1,j=10,sum=0;i<=10;i++,j--){ sum+=i/j; } console.log(sum); |
(4)break 和 continue
break 关键字 可以结束任何形式的循环,break执行后,后边所有的循环体和循环条件都不执行
continue 关键字 跳过本次循环体,继续执行下一次循环
练习:计算1~100之间所有偶数的和(遇到奇数跳过)
|
练习:打印1~100之间所有整数,不包含被3或者4整除的数字。 |
|
for(var i=1,sum=0;i<=100;i++){ if(i%2!=0){ continue; } sum+=i; } console.log(sum); |
for(var i=1;i<=100;i++){ if(i%3==0 || i%4==0){ continue; } console.log(i); } |
|
练习:打印99乘法表
练习:打印本世纪前10个闰年(当打印完第10个就结束循环)
练习:计算1-100之间所有整数的和,当大于4000时,结束循环,打印总和和当前i的值
练习:打印99乘法表 |
练习:打印本世纪前10个闰年(当打印完第10个就结束循环) |
练习:计算1-100之间所有整数的和,当大于4000时,结束循环,打印总和和当前i的值 |
//外层循环:行数 i for(var i=1;i<=9;i++){ //内层循环:列数 j for(var j=1,str='';j<=i;j++){ str+=j+'*'+i+'='+i*j+' '; } //每行循环完,打印 console.log(str); } |
for(var i=2000,n=0;i<=2100;i++){ if((i%4==0 && i%100!=0)|| i%400==0){ console.log(i); n++; } else if(n==10){ break; } } |
for(var i=1,sum=0;i<=100;i++){ sum+=i; if(sum>4000){ onsole.log(sum+' '+i); break; } } c |