表达式、语句
表达式
- 一个表达式可以产生一个值,有可能是运算、函数调用、有可能是字面量。表达式可以放在任何需要值得地方
- 特点:表达式会先执行出一个结果,然后再参与其他程序
语句
- 语句可以理解为一个行为,循环语句和判断语句就是典型的语句。一个程序有很多个语句组成,一般情况下分号;分隔一个一个的语句。
- 语句可以认为是给计算机的一个指令,执行这段代码
- 一般语句以分号结束,特殊的结构除外
流程控制语句
- 通过一些特殊结构可以让js代码加载时,要么可以跳过一部分不加载,或者可以循环加载一段代码
- 包括:条件分支语句、循环语句
if语句的语法
- if语句是最常用的条件分支语句,作用就是通过某个指定的判断条件,决定走哪个分支的代码
if (condition expression) {
statement1;
} else {
statement2;
}
- condition expression:条件表达式,可以是任意的代码或者表达式,参与程序过后才能都会强制得到一个布尔值执行结果。表达式,JS中遇到任何表达式都会先计算出一个结果然后才能继续参与程序
- statement:结构体,JS中可以用{}包括一行到多行语句,这些语句整体组成了一个结构体,结构体中的语句要执行就都执行,要不执行就都不执行
- if:如果
- else:否则
- 总结:如果条件表达式为true,执行结构体1,否则执行结构体2
if语句注意事项
- if语句可以实现选择的功能,两个分支可以选择一个执行,不会都执行
- if语句可以不写else分支,表示条件成立就执行后面的结构体,如果条件不成立,直接跳出if语句不执行。
- if语句后面的结构体如果是单行语句组成,可以省略{}不写。不建议省略大括号,容易出现程序错误。
- if语句能够控制自己内部的流程,但是不论走哪个分支,结束后都要继续执行if语句后面的其他语句,叫做殊途同归现象
多分支if语句
- 包含多个判断条件,对应多个分支
- 语法:
if...else if...else if...else...
- 如果。。。否则如果。。。否则如果。。。否则
if (条件1) {
满足条件1,执行的结构体
} else if (条件2) {
满足条件2,执行的结构体
} else if (条件3) {
满足条件3,执行的结构体
} else {
不满足前面所有条件,执行的结构体
}
注意事项
- 多分支if语句中可以有多个else if的分支,但是else分支只能有一个,必须在最后,作为备用的选项,而且else也可以省略不谢,表示前面条件如果都不满足,直接跳出不走任何分支
- 多分支if语句有跳楼现象:条件从上往下依次验证,如果满足了某个条件,会立即执行后面的结构体,执行完之后,不会再往后验证其他的条件了,而是从这一层直接跳楼跳出if语句,这就是跳楼现象
if语句嵌套
- if语句的结构体部分,代码可以是任意的代码,甚至是另外一组if语句。
- 也就是if语句内部嵌套了if语句
- 如果想执行内部if语句的某个分支,必须满足外部if语句的条件,同时还要满足内部if语句的某个条件
- 优化:可以简化多分支if语句
三元表达式
- 又叫三元运算符,必须有三个操作数参与的运算
- 操作符号:?:
- 表达式:在参与js程序是,都必须先计算出表达式结果,才能参与后续程序
- 由于三元表达式具备了一些选择的效果,所以也是一种条件分支语句
三元表达式语法
boolean_expression?true_value:false_value;
- boolean_expression:布尔表达式,表达式在参与三元运算符中必须求得一个布尔类型的值,要么是true要么是false,结果作为判断依据
- 作用:根据布尔表达式的结果,如果为真,三元表达式结果就是真值,如果为假,三元表达式结果就是假值
三元表达式优点
- 二选一的情况下,三元表达式结构更加简单
- 三元表达式作为一个表达式参与程序时,必须先运算出结果才能参与,可以利用这个特点,将二选一结果赋值给一个变量
- 遇到一个变量根据条件二选一赋值的情况,可以使用三元表达式
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语句首先会将小括号内的表达式计算出一个结果,用结果去匹配结构体内部的case;
- 从上往下进行匹配,如果匹配成功,会立即执行这个case后面的语句,直到遇到一个break跳出整个switch语句;
- 如果前面的case没有匹配成功,会跳过case之间的语句,去匹配下一个case,直到匹配成功,如果都不成功就执行default后面的语句
switch语句的注意事项
- default可以不写,相当于if语句没有else
- break关键字:根据结构需要有时必须在每个case后面都要写,为了模拟跳楼现象,如果不写break,对应的case后面的语句执行之后,不会跳出结构体,会继续向下执行其他case的后面的语句,直到遇到一个break
可以利用break不写的情况制作一些特殊的案例
for循环的语法
- for循环是一种前测试循环语句,在反复执行一段代码之前,都要先测试入口条件,如果条件为真,可以继续循环,如果条件为假,必须跳出循环不再执行
- for循环是一种反复执行一段代码直到测试条件为假时停止
for (;;) {
}
// 呆板的语法:
for (定义循环变量;变量的最大值或最小值;步长) {
循环体;
}
// 这种解释只能涵盖for循环的一部分特殊结构,不能表示所有的for循环实现的情况
for循环的注意事项1
- 小括号内部必须有两个分号
- for循环{}后面不需要加分号
- 如果没有设置入口条件,或者条件永远为真,没法限制什么时候停止循环的话会出现死循环
- 循环的结构体,是可以人为自定义的,甚至可以书写if语句
- for循环嵌套if语句:表示既要能够执行循环,还要满足if语句的条件
- for循环嵌套for循环:外层循环执行一次,内层循环作为外层循环的结构体,必须执行完所有的内层循环,才能进入外层循环下一次
- 循环内的变量是全局变量,必须避免循环嵌套起相同的变量名,内层和外层变量必须不同,常用的变量名i、j、k
do while循环
- do while循环是一种后测试循环语句,回西安只行一次结构体,执行完后才会去判断入口条件,如果条件为真能够继续下一次循环,如果条件为假跳出循环
do {
结构体;
} while(条件表达式)
- do:做什么。后面是每次循环的循环体
- while:当。。。时候
- 先执行一次循环体,然后当条件表达式为真时可以继续循环
注意事项
- 如果循环中需要循环变量参与,循环变量必须定义在循环外面,否则会被重置
- 循环变量自加的过程需要写在{}循环体内部
- 如果将循环变量写在结构体内,i的初始值每次都会被重置,容易出现死循环
- 变量自加过程写在输出语句前面和后面,结果是不同的
- do while 循环即便条件第一次测试就为假,也会执行一次结构体
- 至少会执行一次循环体
while循环
- while循环是一种前测试循环语句,在执行循环体之前都要测试入口条件,条件为真继续执行,条件为假直接跳出循环
whiel (条件表达式) {
循环体;
}
注意事项
- 如果需要循环变量参与,必须定义在循环外部,避免被重置
- 循环变量自加的过程写在循环体内部
总结
- 遇到必须先执行一次结构体的循环,使用do while循环
- 先测试入口条件的循环,可以选在for循环或while循环
break语句
- 我已经找到我的答案了,不需要进行更多的循环了
- break语句的作用可以理解停止当前的for、do while、while循环
- 根据一些条件设置break位置,知道循环能够执行到break语句立即停止执行,跳出循环
注意事项
- break如果没有特殊知识,只能停止自己所在的那一层循环,并不能终止外部循环
- 如果想停止外层循环,可以给外层循环添加一个标签名label,在内层循环的break关键字后面空格加一个label名
continue语句
- 这个答案不是我想要的,赶紧试试下一个吧
- 遇到continue表示当前的一次循环数据不是我们想要的,会立即停止当前次的循环,立即进入下一次循环
- 控制外层循环的方式与break一样,都是添加外层的标签名
总结
break和continue这两个语句的出现可以帮助我们大量的优化代码,减少了计算机的计算次数
穷举思想
- 实际案例中,可能需要找到一些有规律的数据,但是计算机没办法自动智能筛选所要的数据,智能程序员自己书写一段代码,让计算机根据代码去进行筛选
- 穷举思想:是一种解决问题的方法,将所有的需要数据所在范围内所有的数据都一一列举出来,再根据规律的条件对所有这些数据进行筛选,这种方法就是穷举法
制作方法
- for循环:外层使用for循环进行一一列举
- if语句:内层用if语句进行判断,筛选需要的数据,如果满足条件就操作数据,如果不满足条件跳过看下一次循环的数据
累加器和累乘器
累加器
- 有时候需要的不是每个数据是什么,需要得到所有数据的加和,必须想办法将所有的数据的和存起来,就用到了累加器
- 累加器本质就是变量
- 实现累加的效果,就是利用循环,每次循环就将新的数据加到原始的变量中去,赋值过程是一个加等于赋值
注意事项
- 累加器必须定义在循环外面的前面,如果定义在循环内部,每次循环都会将累加器重置,不能实现累加功能
- 累加器的初始值必须设置,而且必须设置为0,不会影响累加结果
- 使用最终累加结果时,必须在for循环结束后的外面,如果写在循环内部,循环没结束,并不是最终需要的值
累乘器
- 累积一些数据的乘积。与累加器非常类似
注意事项
- 累乘器必须定义在循环外部前面
- 累乘器的初始值必须是1,,乘以任何数都等于本身
- 累乘器最终结果必须在for循环结束后使用
水仙花数案例
水仙花数是一种特殊的三位数,它的特点就是每个数位的三次方和,等于它本身
for (var i = 100; i <= 999; 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;
if (sum == i) {
console.log(i)
}
}