代码块
程序是由一条一条语句构成的,语句是按照自上向下的顺序一条一条执行的,在JS中可以使用{}为语句进行分组,同一个{}中的语句我们称为是一组语句,它们要么都执行,要么都不执行,一个{}中的语句我们也称为叫一个代码块,在代码块后面不用编写;了。
JS中的代码块只具有分组作用,没有其他的用途,代码块内部的内容在外部是完全可见的。
流程控制语句
流程控制语句可以控制程序执行流程,使程序可以根据一定的条件来选择执行。
语句的分类:
1、条件判断语句
2、条件分支语句
3、循环语句
条件判断语句:可以在执行某段代码之前进行判断,条件成立才会执行语句,条件不成立则语句不执行。
if语句
语法一:
if(条件表达式) {
语句···
}
if语句在执行时,会先对条件表达式进行求值判断,如果条件表达式的值为true,则执行if后的语句,如果条件表达式的值为false,则不会执行if后的语句。
注意点:
1、if语句只能控制紧随其后的那个语句,如果希望if语句可以控制多条语句,可以将这些语句统一放到代码块中。
2、if语句后的代码块不是必须的,但是在开发中尽量写上代码块,即使if后只有一条语句。
语法二:
if(条件表达式){
语句···
}else{
语句···
}
执行该语句时,会先对if后的条件表达式进行求值判断,如果该值为true,则执行if后语句;如果该值为false,则执行else后的语句。
语法三:
if(条件表达式){
语句···
}else if (条件表达式){
语句···
}else if (条件表达式){
语句···
}else{
语句···
}
当该语句执行时,会从上到下依次对条件表达式进行求值判断,如果值为true,则执行当前语句;如果值为false,则继续向下判断;如果所有条件都不满足则执行最后一个else后的语句。
注意点:该语句中只会有一个代码块被执行,一旦代码块执行了,则直接结束语句。
prompt()可以弹出一个提示框,该提示框中带有一个文本框,用户可以在文本框中输入一段内容,该函数需要一个字符串作为参数,该字符串将会作为提示框的提示文字。prompt()函数的返回值是String类型的,如果想要返回number类型的返回值,则写+prompt()。
例:
var grade = prompt("请输入你的成绩(0-100)");
if (grade>100 || grade<0 || isNaN(grade)) //筛选正确格式的成绩
{alert("成绩输入错误!");}
else if (grade == 100)
{alert("奖励一辆BMW");}
else if (grade>=80&&grade<=99)
{alert("奖励一台iPhone15s");}
else if (grade>=60&&grade<80)
{alert("奖励一本参考书");}
else {alert("什么也没有!");}
用if语句给三个数排序:
var num1=+prompt("输入第一个值:"),num2=+prompt("输入第二个值:"),num3=+prompt("输入第三个值:");
alert("三个值分别是:"+num1+","+num2+","+num3);
if (num1<0||num2<0||num3<0 || isNaN(num1)|| isNaN(num2)|| isNaN(num3)) {alert("输入错误!");}
else 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 (num3<num1&&num3<num2){
if(num1<num2){alert(num3+","+num1+","+num2)}
else {alert(num3+","+num2+","+num1)}
}
条件分支语句,也叫switch语句。
语法:
switch(条件表达式){
case表达式:
语句···
break;//退出switch语句
case表达式:
语句···
break;
···
default: //执行结果都是false则执行default后的语句
语句···
break;
}
执行流程:
在执行时,依次将case后的表达式的值和switch后的条件表达式的值进行全等比较,如果比较结果为true,则从当前case处开始执行代码,当前case后的所有代码都会执行,可以在当前case后使用break可以来退出switch语句;如果执行结果为false,则继续向下比较;如果所有执行结果都是false则执行default后的语句。
注意:switch语句和if语句的功能上是有重复的,使用switch可以实现if的功能,同样使用if也可以实现switch的功能,所有我们使用时,可以根据习惯选择。
方式1:
var grade = +prompt("输入你的成绩(分):")
switch (parseInt(grade/10)) {
case 10:
case 9:
case 8:
case 7:
case 6:
alert("合格");
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
alert("不合格");
break;
default:
alert("成绩输入错误!")
break;
}
方式2:
var grade = +prompt("输入你的成绩(分):")
switch (true) {
case grade>=60:
alert("合格");
break;
case grade<60&&grade>0:
alert("不合格");
break;
default:
alert("成绩输入错误!")
break;
循环语句:通过循环语句可以反复执行一段代码多次。
while循环
语法:
while(条件表达式){
语句···
}
while语句在执行时,先对条件表达式进行求值判断,如果值为true,则执行循环体,循环体执行完毕之后,继续对表达式进行判断,如果为true则继续执行循环体,以此类推;如果值为false,则终止循环。
注意点:
1、将表达式写死为true的循环叫做死循环,该循环不会停止,除非浏览器关闭,死循环在开发中慎用。
2、break也可以用来终止循环。
创建一个循环需要三个步骤:
1、创建一个初始化的变量。
2、在循环中设置一个条件表达式。
3、定义一个更新表达式,每次更新初始化变量。
do···while循环
语法:
do{
语句···
}while(条件表达式)
执行流程:
在执行时先执行循环体,循环体执行完毕后,再对while后的条件表达式进行判断,如果结果为true,则继续执行循环体,执行完毕继续判断以此类推;如果结果为false则终止循环。
实际上这两个语句功能类似,不同的是while是先判断后执行,而do···while会先执行后判断;do···while可以保证循环体至少执行一次,而while不能。
输入本金、年利率和最后总金求年数:
var money=+prompt("本金为:"),i=+prompt("年利率为:"),year=0,m=+prompt("最后总金为:");
while(m>=money){
money=money*(i+1);
year++;
}
alert("年数为:"+year);
使用while循环实现输入错误信息后跳转到重新输入框,实现结果输出后再次回到输入框进行下一次输入。
while (true){
while(true){
var num1=+prompt("输入第一个值:"),num2=+prompt("输入第二个值:"),num3=+prompt("输入第三个值:");
if (num1<0||num2<0||num3<0 || isNaN(num1)|| isNaN(num2)|| isNaN(num3)) {alert("请输入有效的数字!");}
else{ break;}
}
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 (num3<num1&&num3<num2){
if(num1<num2){
alert(num3+","+num1+","+num2)
}
else {
alert(num3+","+num2+","+num1)
}
}
}
for语句,也是一个循环语句,也称为for循环。在for循环中,为我们提供了专门的位置用来放三个表达式:
1、初始化表达式
2、条件表达式
3、更新表达式
语法:
for(初始化表达式;条件表达式;更新表达式){
语句···
}
执行流程:
1、执行初始化表达式,初始变量(只会执行一次)
2、执行条件表达式,判断是否执行循环
3、如果为true,则执行语句循环;如果为false,终止循环。
4、执行更新表达式,更新表达式执行完毕继续重复2。
注意点:
1、for循环中的三部分都可以省略,也可以写在外部。
2、如果在for循环中不写任何的表达式,只写两个;此时循环为一个死循环会一直执行下去,慎用。
打印1-100之间所有奇数之和:
var m=0,i=1;
for(;i<=100;i++){
if((i%2)!=0){m=m+i;}
}
alert("1-100之间所有的奇数之和为:"+m);
1-100之间所有的个数和奇数之和:
var m=0,i=1,j=0;
for(;i<=100;i++){
if((i%7)==0){m=m+i;j++;}
}
alert("1-100之间所有的个数和奇数之和分别为:"+j+","+m);
打印出所有三位数的水仙花数:
var i=100,m=0;
for (;i<1000;i++){
var bai=parseInt(i/100);
var shi=parseInt((i-100*bai)/10);
var ge=parseInt(i%10);
if(bai*bai*bai+shi*shi*shi+ge*ge*ge==i){console.log(i)}
}
输入一个数字,判断该数字是否为质数:
方式一:
var i=2,n=true;
while (true){
var m=+prompt("输入一个大于1的自然数:");
if(m<=1){alert("请输入大于1的自然数!")}
else{break;}
}
for (;i<m&&i>=2;i++){
if(m%i == 0){
alert(m+"不是质数")
n=false;
}
}
if(n==true) {alert(m+"是质数");}
方式二:
var n=0;
while (true){
var m=+prompt("输入一个大于1的自然数:");
if(m<=1){alert("请输入大于1的自然数!")}
else{break;}
}
for (var i=2;i<m&&i>=2;i++){
if(m%i == 0){
alert(m+"不是质数");
n++;
}
}
if(n<1) {alert(m+"是质数");}
在页面中输出如下图形
*
**
****
****
*****
for(var j=0;j<5;j++){
for(var i=0;i<j+1;i++){
document.write("*");
}
document.write("<br/>")
}
倒过来:
for(var j=0;j<5;j++){
for(var i=0;i<5-j;i++){
document.write("*");
}
document.write("<br/>")
}
讲解过程:
打印出1-100之间的所有质数:
for (var i=2;i<=100;i++){
var flag=true;
for (var m=2;m<i;m++){
if((i%m) == 0){
flag=false;
}
}
if(flag == true) {
console.log(i)}
}
break关键字可以用来退出switch或循环语句,不能在if语句中使用break和continue,break默认会立即终止离它最近的循环语句。
可以为循环语句创建一个label,来标识当前的循环label:循环语句
使用break语句时,可以在break后跟着一个label,这样break将会结束指定的循环,而不是结束最近的。break outer;
continue关键字可以用来跳过当次循环,continue默认会对离它最近的循环语句起作用,使用continue语句时,可以在continue后跟着一个label,这样continue将会对指定的循环起作用。
测试程序的性能,在程序执行之前,开启计时器,console.time("计时器的名字")
它需要一个字符串作为参数,这个字符串将会作为计时器的标识。在程序结尾终止计时器console.timeEnd("计时器的名字")
需要计时器的名字作为参数。
可以通过Math.sqrt()
对一个数进行开方
打印出1-100之间的所有质数(改进):
console.time("a");
for (var i=2;i<=100;i++){
var flag=true;
for (var m=2;m<=Math.sqrt(i);m++){//当执行到某一值时,后面便是重复的结果,所有不必再往后执行了
if((i%m) == 0){
flag=false;//一旦进入判断,则已经证明i不是质数了,此时循环再执行已经没有意义了
break;
}
}
if(flag == true) {
console.log(i)}
}
console.timeEnd("a");