一、代码块
程序是由一条一条语句构成。语句按照从上往下的顺序一条一条来执行。
在JS中可以使用{}来为语句进行分组,同一个{}中的语句是一组语句,要么都执行,要么都不执行。{}中的一组语句也称为一个代码块。
特别注意:Js中的代码块,只有分组作用,没其他用途(比如隔离),代码块中的内容,在外部是完成可见的。
exp:
代码块1
{ var a=10; //代码块1中的语句1 声明一个变量a 赋值10
alert("come on,baby"); //代码块1中的语句2
console.log("宝贝,快来"); //代码块1中的语句3
}
console.log(a); //返回 10 。 代码块外依然可以看到a
二、流程控制 if switch while for
程序默认从上往下顺序一条一条执行,有时候,不想顺序执行。通过流程控制语句可以控制程序执行流程,使程序可以根据一定条件来选择执行。
语句分类:
1、条件判断语句
条件判断语句,在执行某语句之前,进行判断,条件成立则执行,不成立则不执行。
语法一:
if(条件表达式){ //条件表达式返回结果为true 则 执行代码块中语句
语句; ...... // 如果要多条语句一起执行,就用代码块。一条语句可以不用{}
}
语法二:
if(条件表达式1) {
语句;.... } else 【if(条件表达式N) { //【】里面的else if 可以嵌套无数个条件
语句;...} else】 {
语句;...}
解释:从上到下依次对条件表达式求值,遇到表达式为true,就执行对应的语句,if语句结束,不会再继续向下判断了。值为false,继续向下判断。 (只会执行 一个代码块 或 语句)。 由于此特性,可能导致不会报错,但永远不被执行的死代码产生。
exp: var age=15;
if(age>7) {alert("你可以上小学了");) else if (age>13) {
alert("你可以上中学了");} else // 15>7,第一个表达式为true,执行上小学。后面就都是死代码(不报错,但没用的代码)
{alert("你可以上大学了");}
2、条件分支语句 switch
语法: switch(条件表达式) {
case 表达式1: 语句; break; //break可跳出switch语句 case 表达式2: 语句; break;
......
default: 语句或代码块; break; } //前面匹配全是false时,执行default语句。最后一个break写不写都一样(建议写)
说明:将 条件表达式(一般为变量) 和 case表达式(一般为一个字面量)做全等(===)比较 ,结果返回true时,从当前case处执行代码(所以如果不用break的话,后面代码就会全部执行,当然也就不需要代码块了)。如果返回false,继续向下判断
注意:变量也可以作为表达式。
if else... if else 在表达式里面 判断 条件是=== 的情况下 和 switch语句功能是一模一样的,可互相代替,用哪个语句,看习惯了
3、循环语句 (do...)while for
反复执行一段代码。
3.1 while 循环
语法: 和if 相似
while(条件表达式) { // 先对条件表达式进行判断,如果值为true,进入循环体
语句.... //代码块中的语句也叫循环体
}
执行流程: 先对条件表达式进行判断,如果值为true,进入循环体。执行完成后,再一次对表达式进行判断,如果值为true,继续执行循环体,以此类推,直到表达式值为false,跳出循环。
特别注意:如果条件表达式给的值永远为true,比如while(true),或while(1),并且后面没加限制条件,程序进入不停止死循环,一直执行到关闭浏览器。所以一旦使用用为true的条件表达式,循环体中必须加入限制条件。
exp:
var n=1; // 初始化变量 n=1
while(true) { //用为true 的表达式
alert(n++);
if(n==10) { //加入条件限制
break;} //break可以终止循环。
}
创建循环步骤:
1、初始化一个变量: var i=0;
2、设置循环表达式:while(i<10)
3、循环体中定义更新表达式: i++
3.2 do...while 循环
语法:
do {
语句;...
} while(条件表达式)
执行流程:不管条件表达式为true还是 false ,先执行一次循环体(和while不一样的地方)。然后再对条件表达式进行判断,如果值为true,继续循环体。再一次对表达式进行判断,如果值为true,继续执行循环体,以此类推,直到表达式值为false,跳出循环。
while和do..while差异:do...while 可以保证循环体至少执行一次,而while不能。
3.3 for 循环 改进while循环 将初始化表达式,条件表达式,更新表达式 放在一起
语法:
for(初始化表达式;条件表达式;更新表达式) {
语句;... // 可继续嵌套for循环
}
执行流程:
1、执行初始化表达式,初始化变量。(初始化表达式只会执行一次)
2、执行条件表达式,判断是否执行循环。如果为true,执行循环体,如果为false 终止循环
3、执行更新表达式,更新表达式执行完毕以后,重复第二步
特别注意:
for循环三个部分都可以省略,也可以写在外部
exp:初始化和更新表达式 写在外部 (完全类似while)
var i =0;
for( ; i<10; ) { //此案例 for语句中只写了条件表达式,初始化表达式和更新表达式都写在了外部
alert(i++) ; }
exp: 三部分都省略(死循环)
for( ; ; ) { //三部分都没有,进入死循环。 慎用
alert("hello") ; }
三、break 和 continue
1、break关键字
用于立即退出 离break 最近的 switch 和 循环, 不能应用于单独的if语句,会报错
exp:
for(var i=0; i<5; i++) {
console.log("外层循环"+i);
for(var j=0;j<5;j++) {
console.log("内层循环"+j);
if(j==2){
break;} //这个break 是用于退出离它最近的for循环(内层循环),跟if 没关系。如果没有for循环,break单独放在if里,就报错
}
}
☆label标签
如果某段代码有多个for循环嵌套,我想终止其中特定某一个for循环,找离它最近的位置又很麻烦。此时可为循环语句创建一个label(名字随便取),来标识当前的循环。
语法: label:循环语句
标识以后,可以在break后跟着一个label名,这样break可以结束指定循环,而不是离它最近的循环。
exp:
outer: //给外层for循环一个叫做outer的label标签
for(var i=0; i<5; i++) {
console.log("外层循环"+i);
for(var j=0;j<5;j++) {
console.log("内层循环"+j);
if(j==2){
break outer;} //在j==2时,直接终止外部循环,而不是最近的内部循环。
}
}
2、continue 关键字
跳过 当次 循环,继续执行剩余循环(一般搭配if语句,跳过满足特定条件的某一次循环)。 总结: contine只跳过一次,break是整个循环结束
同样 continue 默认只会对离它最近的循环产生影响。 同样,contine可以使用label标签,语法也一样