04-流程控制
1.代码块
1).我们的程序是由一条一条语句构成的,语句是按照自上向下的顺序一条一条执行的
在JS中可以使用{}来为语句进行分组:
同一个{}中的语句我们称为是一组语句,
同一个代码块中的代码,就是同一组代码,它们要么都执行,要么都不执行,
一个{}中的语句我们也称为叫一个代码块,在代码块的后边就不用再编写;了
{ let a=20; }
2).使用 {} 来创建代码块,代码块可以用来对代码进行分组,
let和var:
-在JS中,使用let声明的变量具有块作用域,在代码块中声明的变量无法在代码块的外部访问
-使用var声明的变量,不具有块作用域,JS中的代码块,只具有分组的的作用,没有其他的用途,代码块内部的内容在外部是完全可见的
{
① var a = 10;
② let a=10;
alert("你好");
}
console.log(a);
JS中的程序是从上到下一行一行执行的
-通过流程控制语句可以控制程序执行流程,使程序可以根据一定的条件来选择执行
-语句的分类:
①.条件判断语句
②.条件分支语句
③.循环语句
2.条件判断语句
-使用条件判断语句可以在执行某个语句之前进行判断,如果条件成立才会执行语句,条件不成立则语句不执行。
1).if语句
语法一:
if(条件表达式){
语句......
}
执行流程:
if语句在执行会先对if后的条件表达式进行求值判断,如果结果为true,则执行if后的语句,如果为false,则不执行
-if语句只会控制紧随其后其后的那一行代码,如果希望可以控制多行代码,可以使用{}将语句扩起来
-最佳实践:即使if后只有1行代码,我们也应该编写代码块,这样结构会更加的清晰
-如果if后的添加表达式不是布尔值,会转换为布尔值然后再运算
var a=15;
if(a>10 && a<=20){
alert("a大于10,并且a小于等于20");
}
if(100){
alert("你猜我执行吗?");
}
语法二:
if(条件表达式){
语句...
}else{
语句...
}
执行流程:
if...else...语句
当该语句执行时,会先对if后的条件表达式进行求值判断,如果该值为true,则执行if后的语句,如果该值为false.则执行else后的语句
if(age>=60){
alert("你已经退休了");
}else{
alert("你还没退休");
}
语法三:
if(条件表达式){
语句...
}else if(条件表达式){
语句...
}else if(亲件表达式){
语句..
}else{
语句...
}
执行流程:
if-else if-else语句,会自上向下依次对if后的条件表达式进行求值判断,
如果条件表达式结果为true,则执行当前if后的语句,执行完毕语句结束
如果条件表达式结果为false,则继续向下判断,直到找到true为止
如果所有的条件表达式都是false,则执行else后的语句
注意:
if-else if-else语句中只会有一个代码块被执行,一旦有执行的代码块,下边的条件都不会在继续判断,所以一定要注意条件的编写顺序
var age=50;
if(age > 100){
alert("活着挺没意思的~~");
}else if(age > 80){
alert("你也老大不小的了~~" );
}else if(age > 60){
alert("你也退休了~~");
}else if(age > 30){
alert("你已经中年了~~");
}else if(age > 17){
alert("你已经成年了");
}else{
alert("你还是个小孩子~~");
}
练习①:
//判断值是否合法
var score = prompt("请输入小明的期末成绩(1-100分):");
/*
prompt()可以弹出一个提示框,该提示框中会带有一个文本框,
用户可以在文本框中输入一段内容,该函数需要一个字符串作为参数,该字符串将会作为提示框的提示文字
用户输入的内容将会作为函数的返回值返回,可以定义一个变量来接受该内容
*/
if(score>100 || score<0 || isNaN(score)){
alert("输入值不合法!");
}else{
if(score==100){
alert("奖励一辆BMW");
}else if(score>=80){
alert("奖励一台iPhone15s");
}else if(score>=60){
alert("奖励一本参考书");
}else{
alert("奖励一个大比斗");
}
}
练习②:
var tall=prompt("请输入您的身高(cm):");
var rich=prompt("请输入您的财富(万):");
var hand=prompt("请输入您的颜值(px):");
alert(tall+"--"+rich+"--"+hand);
if(tall>=180 && rich>=1000 && hand>=500){
alert("我一定要嫁给他!");
}else if(tall>=180 || rich>=1000 || hand>=500){
alert("嫁吧,比上不足,比下有余");
}else{
alert("不嫁!");
}
练习③:
// 获取用户输入的三个值
// prompt()函数的返回值是string类型的
var num1=+prompt("请输入数字1:");
var num2=+prompt("请输入数字2:");
var num3=+prompt("请输入数字3:");
alert(num1+"--"+num2+"--"+num3);
if(num1<num2&& num1<num3){
if(num2<num3){
alert(num1+","+num2+","+num3)
}else{
alert(num1+","+num3+","+num2)
}
}else if(num2<num1 && num2<num3){
if(num1<num3){
alert(num2+","+num1+","+num3)
}else{
alert(num2+","+num3+","+num1)
}
}else{
if(num1<num2){
alert(num3+","+num1+","+num2)
}else{
alert(num3+","+num2+","+num1)
}
}
3.条件分支语句
条件分支语句也叫switch语句
语法:
switch(条件表达式){
case表达式:
语句...
break;
case表达式:
语句...
break;
default:
语句...
break;
}
执行流程:
switch. ..case..语句
语句在执行时,会依次将switch后的表达式和case后的表单式进行全等比较
如果比较结果为true,则自当前case处开始执行代码
如果比较结果为false,则继续比较其他case后的表达式,直到找到true为止
如果所有的比较结果都为false,则只执行default后的语句
switch语句和if语句的功能实际上有重复的,使用switch可以实现if的功能,同样使用if也可以实现switch的功能,所以使用时,可以根据自己的习惯选择。
注意:
当比较结果为true时,会从当前case处开始执行代码,也就是说case是代码执行的起始位置
这就意味着只要是当前case后的代码,都会执行可以使用break来避免执行其他的case
//根据num的值,输出对应的中文
var num=1;
switch(num){
case 1:
console.log("壹~");
// 使用break可以来退出switch语句
break;
case 2:
console.log("贰~");
break;
default:
console.log("非法数字~~");
}
//对于成绩大于60分的,输出‘合格’。低于60分的输出‘不合格’
var score=55;
var num=(score>60);
switch(num){
case true:
console.log("合格");
break;
default:
console.log("不合格");
}
//从键盘接收整数参数,如果该数为1-7,打印对应的星期,否则打印非法参数
var day=Number(prompt("输入数字:"));
console.log(typeof day);
switch(day){
case 1:
console.log("星期一");
break;
case 2:
console.log("星期二");
break;
case 3:
console.log("星期三");
break;
case 4:
console.log("星期四");
break;
case 5:
console.log("星期五");
break;
case 6:
console.log("星期六");
break;
case 7:
console.log("星期日");
break;
default:
console.log("非法参数!");
}
4.循环语句
-循环语句:通过循环语句可以反复的执行一段代码多次
-JS中一共有三种循环语句:
①.while循环
②.do...while循环
③.for循环
1).while循环
语法:
while(条件表达式){
语句...
}
执行流程:
while语句在执行时,会先对条件表达式进行判断,
如果结果为true,则执行循环体,执行完毕,继续判断
如果为true,则再次执行循环体,执行完毕,继续判断,
如此重复直到条件表达式结果为false时,循环结束
注意:
//向页面中输出连续的数字
var n=1;
//向这种将条件表达式写死为true的循环,叫做死循环
//该循环不会停止,除非浏览器关闭,死循环在开发中慎用
//可以使用break,来终止循环
while(true){
alert(n++);
if(n==10){
// 退出循环
break;
}
}
通常编写一个循环,要有三个要件:
1.初始化表达式 (初始化变量)
2.条件表达式 (设置循环运行的条件)
3.更新表单式 (修改初始化变量)
// 创建一个循环,往往需要三个步骤
// 1.创建初始化一个变量
var i=1;
// 2.在循环中设置一个条件表达式
while(i<11){
alert(i);
// 3.定义一个更新表达式,每次更新初始化变量
i++;
document.write(i++ +"<br/>");
}
练习①:
//假如投资的年利率为5%,试求从1000块到5000块需要多久?
// 定义一个变量,表示当前的钱数
var money=1000;
// 定义一个计数器
var count=0;
// 定义一个while循环来计算每年的钱数
while(money<5000){
money*=1.05;
//使计数器count自增
count++;
}
document.write("一共需要"+count+"年");
练习②:
//判断输入的值是否合法
//将prompt放入到一个循环中
while(true){
var score=prompt("请输入小明的期末成绩(0-100):");
// 判断用户输入的值是否合法
if(score>=0&&score<=100){
// 满足该条件则证明用户的输入合法,退出循环
break;
}
alert("请输入有效的分数!");
}
2).do…while循环
语法:
do{
语句...
}while(条件表达式)
执行流程:
do. . .while语句在执行时,会先执行循环体,
循环体执行完毕以后,在对while后的条件表达式进行判断,
如果结果为true,则继续执行循环体,执行完毕继续判断以此类推,如果值为false,则终止循环
do{
document.write(i++ +"<br/>");
}while(i<=10)
console.log(i);
while语句和do…while语句的区别:
实际上这两个语句功能类似,不同的是while是先判断后执行,而do. …while会先执行后判断,
do. …while可以保证循环体至少执行一次,而while不能
var i = 10;
① do {
i += 2;
} while (i < 10)
② while (i < 10) {
i += 2
}
console.log(i);
3).for循环
for语句,也是一个循环语句,也称为for循环
for循环和while没有本质区别,都是用来反复执行代码,不同点就是语法结构,for循环更加清晰
在for循环中,为我们提供了专门的位置用来放三个表达式:
1.初始化表达式
2.条件表达式
3.更新表达式
语法:
for(①初始化表达式;②条件表达式;④更新表达式){
③语句...
}
执行流程:
①执行初始化表达式,初始化变量
②执行条件表达式,判断循环是否执行(true执行,false终止)
③判断结果为true,则执行循环体
④执行更新表达式,对初始化变量进行修改
⑤重复②,直到判断为false为止
for(var i=0;i<10;i++){
alert(i);
}
初始化表达式,在循环的整个的生命周期中只会执行1次
①.for循环中的三个部分都可以省略,也可以写在外部:
var i=0;
for(;i<10;){
alert(i++);
}
②.如果在for循环中不写任何的表达式,只写两个,此时循环是一个死循环会一直执行下去,慎用
for(;;){
alert("hello");
}
③.使用 let 在for循环的 () 中声明的变量是局部变量,只能在for循环内部访问,使用 var 在for循环的 () 中声明的变量,可以在for循环的外部访问
创建死循环的方式:
while(1){}
for( ;;){}
a.嵌套的for循环
练习①:
在页面输出以下图形
*
**
***
****
*****
for(var i=0;i<5;i++){
//外部for循环执行1次,内部的循环就会执行i次
//内部的for循环执行几次,图形的宽度就是多少
for(var j=0;j<1+i;j++){
// for(var j=0;j<5-i;j++){ //相反的图形
document.write("* ");
}
document.write("<br/>");
}
练习②:
打印99乘法表
for(var i=1;i<10;i++){
for(var j=1;j<i+1;j++){
document.write("|"+j+"*"+i+"="+i*j );
}
document.write("<br/>");
}
练习③:
打印2-100之间所有的质数
for(var i=2;i<=100;i++){
// 创建一个布尔值,用来保存结果,默认i是质数
var flag=true;
// 判断i是否是质数
// 获取2-i之间的所有数
for(var j=2;j<i;j++){
// 判断i是否能被j整除
if(i%j==0){
// 如果进入判断则证明i不是质数
flag=false;
}
}
// 如果是质数,则打印i的值
if(flag){
document.write(i+"<br/>");
}
}
b.break和continue
①.break
-break用来终止switch和循环语句
-break执行后,当前的switch或循环会立刻停止
-break会终止离他最近的循环
for(var i=0;i<5;i++){
document.write("@外层循环"+i+"<br/>");
for(var j=0;j<5;j++){
break;
document.write("@内层循环"+j+"<br/>");
}
}
②.label
可以为循环语句创建一个label,来标识当前的循环
使用break语句时,可以在break后跟着一个label,这样break将会结束指定的循环,而不是最近的
outer:
for(var i=0;i<5;i++){
document.write("@外层循环"+i+"<br/>");
for(var j=0;j<5;j++){
break outer;
document.write("@内层循环"+j+"<br/>");
}
}
③.continue
-continue用来跳过当次循环
-同样continue也是默认只会对离他最近的循环循环起作用
for(var i=0;i<5;i++){
if(i==2){
continue;
}
document.write(i+"<br/>");
}
for(var i=0;i<5;i++){
for(var j=0;j<5;j++){
if(j==1){
continue;
}
document.write("--->"+j+"<br/>");
}
document.write("@--->"+i+"<br/>");
}
c.质数练习
在页面中接收一个用户输入的数字,并判断该数是否是质数。
质数:只能被1和它自身整除的数,1不是质数也不是合数,质数必须是大于1的自然数。
写法①:
var num=prompt("请输入一个大于1的整数");
if(num<=1){
alert("该值不合法");
}else{
//判断一个变量来保存当前的状态
// 默认当前num是质数
var flag=true;
// 判断num是否是质数
// 获取2-num之间的数
for(var i=2;i<num;i++){
//判断num是否能被i整除
if(num%i==0){
// 如果num能被i整除,则说明num一定不是质数
// 设置flag为false
flag=false;
}
}
// 如果num是质数则输出
if(flag){
alert(num+"是质数");
}else{
alert(num+"不是质数");
}
}
写法②:
测试如下的程序的性能:
在程序执行前,开启计时器
console.time()可以用来开启一个计时器,它需要一个字符串来作为参数,这个字符串将会作为计时器的标识
// 打印1-100之间所有的质数
for(var i=2;i<=100;i++){
var flag=true;
// 判断i是否是质数
// 获取2-i之间所有的数
for(var j=2;j<=Math.sqrt(i);j++){
//判断i是否能被j整除
if(i%j==0){
// 如果j能被i整除,则说明j一定不是质数
flag=false;
//一旦进入判断,则证明i不可能是质数了,此时循环再执行已经没有任何意义
//使用break来结束循环
break;
}
}
if(flag){
document.write(i+"<br/>");
}
}
console.timeEnd("test");
终止计时器
console.timeEnd()用来停止一个计时器,需要一个计时器的名字作为参数