表达式
- 一个表达式可以产生一个值,有可能是运算、函数调用、有可能是字面量。表达式可以放在任何需要值的地方。
- 特点:表达式会先执行出一个结果,然后再参与其他程序。
语句
- 语句可以理解为一个行为,循环语句和判断语句就是典型的语句。一个程序有很多个语句组成,一般情况下分号 ; 分割一个一个的语句。
- 语句可以认为是给计算机的一个指令,执行这段代码。
- 一般语句以分号结束,特殊的结构除外。
流程控制语句
- 流程控制语句:通过一些特殊结构可以让 js 代码加载时,要么可以跳过一部分不加载,或者可以循环加载一段代码。
- 包括:条件分支语句、循环语句。
条件分支语句
if语句
- if语句是最常用的条件分支语句,作用就是通过某个特定的判断条件,决定走哪条分支的代码
-结构:
if (condition expression) {
statement1;
} else {
statement2;
}
-
condition expression:条件表达式,任意的代码或者表达式,参与程序过程都会强制得到一个布尔值执行结果。表达式,js中遇到的任何表达式都会计算出一个结果然后才能继续执行程序
-
statement:结构体,js中可以使用{}包含一行到多行的语句,这些语句构成了一个结构体,结构体的语句要执行就都会执行,取决于condition expression的结果
-
if:如果
-
else:否则
-
上述代码总结:如果条件表达式是true,执行1,否则执行2
注意事项
- if 语句可以实现选择的功能,两个分支可以选择一个执行,不会都执行。
- if 语句可以不写 else 分支,表示条件成立就执行后面的结构体,如果条件不成立,直接跳出 if 语句不执行。
- if 语句后面的机构体如果是单行语句组成,可以省略 {} 不写。不建议省略大括号,容易出现程序错误。
- if 语句能够控制自己内部的流程,但是不论走哪个分支,结束后都要继续执行 if 语句后面的其他语句,叫做殊途同归现象。
多分支if语句
- 包含多个判断条件,对应多个分支。
- 语法:if……else if……else if……else……
- 结构:
if (条件1) {
满足条件1,执行的结构体
} else if (条件2) {
不满足条件1,满足条件2,执行的结构体
} else if (条件3) {
不满足条件1/2,满足条件3,执行的结构体
} else {
不满足前面所有条件,执行的结构体
}
注意事项
①多分支 if 语句中可以有多个 else if 的分支,但是 else 分支只能有一个,必须出现在最后,作为备用的选项,而且 else 也可以省略不写,表示前面条件如果都不满足,直接跳出不走任何分支。
②多分支 if 语句有跳楼现象:条件从上往下依次验证,如果满足了某个条件,会立即执行后面的结构体,执行完之后,不会再往后验证其他的条件了,而是从这一层直接跳楼跳出if语句,这就是跳楼现象。
if语句嵌套
- if语句内部嵌套了if语句
- 如果想执行内部 if 语句的某个分支,必须满足外部 if 语句的条件,同时还要满足内部 if 语句的某个条件。
- 优点:可以简化多分支 if 语句。
案例:男女退休判断
// 外层的 if 语句只判断性别
// 内层的 if 语句只判断年龄
if (sex === "男") {
// 男性,年龄需要大于60岁
if (age >= 60) {
alert("恭喜你,可以享受人生了");
} else {
alert("忍忍吧,还要坚持坚持");
}
} else {
// 女性,年龄需要大于55岁
if (age >= 55) {
alert("恭喜你,幸福人生开始了");
} else {
alert("太难了,还得继续坚持");
}
}
三元表达式
- 又名三元运算符,必须有三个操作数参与的运算
- 操作符:
? : - 表达式:参与js程序的时候,必须计算出来表达式结果,才能参与后续的程序
- 三元表达式具备了一些选择的效果,所以也是一种条件分支语句
语法:
- boolean_expression ? true_value : false_value;
- boolean_expression:布尔表达式,表达式在参与三元运算中必须求得一个布尔类型的值,要么是 true,要么是 false,结果作为判断依据,判断到底去:前面的值还是后面的值。
- true_value:布尔表达式的值为真时,三元表达式的结果。
- false_value:布尔表达式的值为假时,三元表达式的结果。
- 作用:根据布尔表达式的结果,如果为真,三元表达式结果就是真值,如果为假,三元表达式结果就是假值
var a = 4;
var b = a >= 5 ? 1 : 0;
console.log(b);
运行结果:0
优点
- 虽然if语句可以模拟三元表达式,但是三元表达式有自己的优点:
①二选一的情况下,三元表达式结构更加简单。
②三元表达式作为一个表达式参与程序时必须运算出结果才能参与,可以利用这个特点,将二选一结果赋值给一个变量。 - 遇到给一个变量根据条件二选一赋值的情况,可以使用三元表达式。
switch语句
- 开关语句允许一个程序求一个表达式的值,并且尝试去匹配表达式的值到一个case标签,匹配成功,这个程序执行相关的语句
- 语法:
switch (表达式) {
case 值1:
结构体1;
break;
case 值2:
结构体2;
break;
……
default:
结构体n;
break;
}
- switch:关键字表示开始进入一个开关语句
- 表达式:会求出一个具体的值,用于去匹配case后面的值,匹配相等的条件不只是值相等,数据类型也要相等
- case:示例,关键字后面要有空格,书写匹配的值
- case后面的结构体,每个case匹配成功之后要有执行的语句
- break:打断结构体,直接跳出,模拟跳楼现象
- default:相等于if的else,否则的情况,case都不匹配的话,就执行default后面的语句
switch语句运行机制
- switch 语句首先会将小括号内的表达式计算出一个结果,用结果去匹配结构体内部的 case;
- 从上往下进行匹配,如果匹配成功,会立即执行这个 case 后面的语句,直到遇到一个 break 跳出整个 switch 语句;
- 如果前面的 case 没有匹配成功,会跳过 case 之间的语句,去匹配下一个 case,直到匹配成功,如果都不成功就执行 default 后面的语句。
注意事项
- default可以不写,等于if里没有else,同理
- break关键字,每个case后面都要写,不写的话就不会跳出结构体,会一直运行到直至遇到下一个break
- 可以用break不写的情况制作一些特殊的案例
条件分支语句的总结
- 三种语句的情景
- if:所有的判断条件都能书写
- 三元表达式:多用于给变量赋值的二选一情况
- switch:多用于给一个表达式去匹配多种固定值可能性的情况
循环语句
for循环
- for 循环是一种前测试循环语句,在反复执行一段代码之前,都要先测试入口条件,如果条件为真,可以继续循环,如果条件为假,必须跳出循环不再执行。
- or 循环是一种反复执行一段代码直到测试条件为假时停止。
for(定义循环变量;变量的最大值或最小值;步长){
循环体;
}
这种解释只能涵盖 for 循环的一部分特殊结构,不能表示所有的 for 循环实现的情况。
for循环注意事项
- 小括号内部必须有两个分号。
- for 循环 {} 后面不需要加分号。
- 如果 ② 位置语句不写,相当于没有设置入口条件,或者条件永远为真,没法限制什么时候停止循环了,出现死循环。
- ③ 位置是循环的结构体,每次进入循环都要执行完后,才能执行语句 ④,③ 位置的语句是可以人为自定义的,甚至可以书写 if 语句。
- for 循环嵌套 if 语句:表示既要能够执行循环,还要满足 if 语句的条件。
- for 循环嵌套 for 循环:外层循环执行一次,内层循环作为外层 ③ 位置的结构体,必须执行完所有的内层循环,才能进入外层循环下一次的 ④。
- 循环内的变量是全局变量,必须避免循环嵌套时起相同的变量名,内层和外层变量名必须不同,常用的变量名 i,j,k。
do while循环
do while 循环是一种后测试循环语句,会先执行一次结构体,执行完后才会去判断入口条件,如果条件为
真能够继续下一次循环,如果条件为假跳出循环。
- 语法:
do{
结构体;
}while(条件表达式);
- do:做什么。后面是每次循环的循环体。
- while:当……时候。
- 先执行一次循环体,然后当条件表达式为真时可以继续循环。
注意事项
- 如果循环中需要循环变量参与,循环变量必须定义在循环外面,否则会被重置。
- 循环变量自加的过程需要写在 {} 循环体内部。
- 如果将循环变量写在结构体内,i的初始值每次都会被重置,容易出现死循环。
- 变量自加过程写在输出语句前面和后面,结果是不同的。
- do while 循环即便条件第一次测试就为假,也会执行一次结构体。
至少会执行一次循环体。
while循环
- while 循环是一种前测试循环语句,在执行循环体之前都要测试入口条件,条件为真继续执行,条件为假直接跳出循环。
语法
while(条件表达式){
循环体;
}
当条件表达式为真时,执行循环体,如果为假,跳出循环。
注意事项
- 如果需要循环变量参与,必须定义在循环外部,避免被重置。
- 循环变量自加的过程写在循环体内部。
总结
- 遇到必须要执行一次循环体的循环,使用do while
- 先测试入口条件的循环,选择for或者while
break语句
- break语句可以立即停止当前的for、do while、while循环
- 根据一些条件设置break位置,直到循环能够执行到break语句立即停止执行,跳出循环
注意事项
- break 如果没有特殊指示,只能停止自己所在的那一层循环,并不能终止外部循环。
-
如果想停止外层循环,可以给外层循环添加一个标签名 label,在内层循环的 break 关键字后面空格加一个 label 名。
continue语句
- 遇到continue表示当前的一次循环数据不是想得到的,立即停止当前循环进行下一次循环
注意事项
- 要根据特殊条件设置 continue 的位置。
- continue 如果没有特殊指示只能进入自己的下一次循环,不能立即停止外层循环的这一次进入下一次。
-
控制外层循环的方式与 break 一样,都是添加外层的标签名。
总结
break和continue这两个语句的出现可以帮助我们大量的优化代码,减少计算次数
穷举思想
- 实际案例中,可能需要找到一些有规律的数据,但是计算机没办法自动智能筛选所要的数据,只能程序员自己书写一段代码,让计算机根据代码去进行筛选。
- 穷举思想:是一种解决问题的方法,将所有的需要数据所在的范围内所有的数据都一一列举出来,再根据规律的条件对所有这些数据进行筛选,这种方式就是穷举法。
制作方法:
- for循环:外层使用for循环进行一一列举
- if语句:内层用if判断,筛选数据,有满足的就操作数据,不满足的跳过看下一次循环数据
案例:
// 让用户随意输入一个正数,给用户输出这个数字所有的约数
var n = parseInt(prompt("请输入一个正整数"));
// 穷举思想,外层一一列举可能性,内层判断
for (var i = 1 ; i <= n ; i++) {
// 内层判断 i 是否是 n 的约数
if (n % i == 0) {
console.log(i + "是" + n + "的一个约数");
}
}
累加器
- 有时候需要的不是每个数据是什么,需要得到所有数据的加和,必须想办法将所有的数据的和存起来,就用到了累加器。
- 累加器本质就是变量。
- 实现累加的效果,就是利用循环,每次循环就将新的数据加到原始的变量中去,赋值过程是一个加等于赋值。
案例:
//定义累加器
var sum = 0;
for(var i = 1 ; i <= 10 ; i ++){
sum+=i;
}
console.log(sum);
注意事项
- 累加器要定义在循环的外面,定义在内部的话会被重置,不能实现累加功能
- 初值必须设置,而且应该设置为0,不影响累加的效果
- 用最终的累加效果的时候,必须在for循环结束的外面,写在内部,循环还没有结束
累乘器
- 与累加器几乎一致
//定义累乘器
var mul= 0;
for(var i = 1 ; i <= 10 ; i ++){
mul*=i;
}
console.log(mul);
注意事项
- 累乘器必须定义在循环外部前面。
- 累乘器的初始值必须是 1,1 乘以任何数都等于本身。
- 累乘器最终结果必须在 for 循环结束后使用。
实际案例:水仙花数
- 水仙花数:个十百位的三次方相加等于本身的数
思想:使用循环进行穷举法列举出所有的三位数,分别计算出个十百位的数字,然后定义一个变量把相加得到的值赋值给它,再进行判断
// 穷举思想,列举所有的三位数
for (var i = 100 ; i <= 999 ; i++) {
// i 的三个数位的三次方的和,等于 i 自己
// 找到个位、十位、百位的数字
var ge = i % 10,
shi = parseInt(i / 10) % 10,
bai = parseInt(i / 100);
// 计算三个数位的三次方的和
var sum = ge * ge * ge + shi * shi * shi + bai * bai * bai ;
// 判断 sum 是否等于 i 自己,如果是,就是水仙花数,需要输出
if (sum == i) {
console.log(i);
}
}
答案
网友评论