逻辑运算符
比较运算符只能比较两个值,但是有时候我们需要进行多个数值的比较。 这个时候就需要用到逻辑运算符。
-
&&
,逻辑与(并且),第一个操作数和第二个操作数都为true的时候返回true,否则返回false。- 逻辑运算符可以使用任何类型的操作数。如果操作数是布尔型直接比较,如果不是要进行
Boolean()
转换。 - 如果第一个操作数是false(或经过Boolean()转换为false),那么返回的是第一个操作数。如果第一个操作数是true(或经过Boolean()转换为true),那么返回的是第二个操作数。
- 如果第一个操作数能够决定结果(false或经过转换后为false),那就不对第二个操作数进行求值了,因为已经能够决定结果了。这就是所谓的
短路
。
- 逻辑运算符可以使用任何类型的操作数。如果操作数是布尔型直接比较,如果不是要进行
-
||
,逻辑或(或者),第一个操作数或第二个操作数为true时候返回true,否则返回false(两边都为false的时候才为false)。- 逻辑运算符可以使用任何类型的操作数。如果操作数是布尔型直接比较,如果不是要进行
Boolean()
转换。 - 如果第一个操作数是true(或经过Boolean()转换为true),那么返回的是第一个操作数。如果第一个操作数是false(或经过Boolean()转换为false),那么返回的是第二个操作数。
- 逻辑或也有短路操作,如果第一个操作数求值为true,就不会对第二个操作数求值了(因为第一个操作数已经能决定结果了)。
- 逻辑运算符可以使用任何类型的操作数。如果操作数是布尔型直接比较,如果不是要进行
-
!
,取反,用来取得指定布尔值取反的结果。(最终结果还是布尔值)-
如何操作数不是布尔型,会先将它转换为布尔值。
-
可以使用
!!
(两次调用!
)将变量转换为布尔值var a = 1; console.log(!!a);
-
三元运算符
-
运算元:
1 + 2
,1和2分别代表运算元(操作数),+
代表操作符。 -
按照运算元来分类:
-
一元运算符:
!
、+
、-
、++
、--
-
二元运算符:
+
、-
、*
、/
、&&
、||
&&
,逻辑与 and||
,逻辑或 or!
,取反 not
-
三元运算符:三元运算符只有一个。
运算元1 ? 运算元2 : 运算元3;
运算元1是条件,当运算1为true时返回运算元2,为flase时返回运算元3。
-
运算符优先级
简要:一元运算符通常优先级比较高,然后二元,最后三元。
运算符小口诀:一元、算数、关系、逻辑、三元、后赋值。
关联性:决定了拥有相同优先级的运算符的执行顺序。
a 操作符 b 操作符 c
- 从左到右,那就相当于将左边的子表达式上加上小括号
(a 操作符 b) 操作符 c
- 从右到左,相当于
a 操作符 (b 操作符 c)
var a = 1;
console.log(!(!a));//!!a
小括号:分组操作符、函数调用符。
流程控制
流程控制概述
-
什么是流程控制?
通过触发某种条件,导致我原本的流程发生了一些改变。
-
流程控制的结构:
- 顺序结构:(最基本的结构,程序从上往下执行)。
- 分支结构:如果xxxxx 我就xxxxxx样。
- 循环结构:重复做一组动作。
分支结构
分支结构就4种,不管程序多大、多复杂都是这几种情况。
-
单一分支结构
格式:
if (条件表达式) { 代码块1 }
如果条件表达式
值为true则执行代码块1
的代码,如果为false则忽略,不执行代码块1的代码。程序继续向下执行。
注意:
- 可以在括号中直接执行true或false,但是没有任何意义。
- 括号里面不是表达式,会将他的值通过
Boolean
进行转换,然后根据转换后的结果判断是否执行。 - 如果大括号内只有一条语句,可以省略大括号(不建议使用。)
-
双向分支结构
格式:
if (条件表达式) { 代码块1 } else { 代码块2 }
如果
条件表达式
的值为true则执行代码块1
的代码,如果为false就执行代码块2的代码,执行完整个if语句之后就继续执行下面的代码。注意:
- 它有一个特点,必须执行if区间的代码或else区间的代码。
- 如果大括号内只有一条语句,可以省略大括号(不建议使用。)
-
多向分支结构
格式:
if (条件表达式1) { 代码段1 } else if (条件表达式2) { 代码段2 } else if (条件表达式3) { 代码段3 } ..... else { 都不成立时执行的代码段。 }
如果条件表达式1返回true就执行代码段1,条件表达式2执行就返回代码段2…如果条件都不成立时执行else里面的内容。
注意:
- else可以省略。
- if条件从上往下执行,执行了一处大括号的代码之后其他的条件不会检查也不会执行。
- if语句__通常__用来判断范围条件。但是也能判断是否相等。
-
switch语句
从本质上讲,它是为了让开发人员免于大量使用
if(){....}else if()
语句。格式:
switch(有值的东西){ case 值1: 代码块1 break; case 值2: 代码块2 break; ...... case 值n: 代码块n break; default: 默认匹配的代码块 break; }
执行过程:
- 先确定switch中小括号的值是什么
- 用确定出来的值分别和case后面的值进行匹配(这里进行匹配是全等于匹配)
- 找到第一个能够匹配上的case之后,执行其中对应的代码块。
- 执行完这个代码块之后调用break退出switch语句。
- 如果一直到最后都没有找到匹配的内容,那么执行default中的语句。(相当于else)
注意:
- switch语句在比较值时使用的是全等于,不会发生类型转换。
- default语句可以省略。
- break是否可以省略,可以。如果省略break就会导致执行完当前case之后继续执行下一个case(不管是否能够匹配上),遇到break为止。
- switch也可以用来进行某个条件的判断。但是我们通常用switch来进行某个值得精确匹配。
-
巢状分支结构
是将前面几种分支综合、嵌套使用。
在分支结构中可以使用我们学过的任意的代码。
我们写代码的时候一般情况下,嵌套不会超过3层,如果超过的话就得注意看看逻辑、代码是否有优化的地步。
循环结构
程序中有些代码需要反复执行多次,这个时候就用到了循环
-
while语句
格式:
while(条件表达式){ 代码块 }
第一步先执行条件表达式,表达式为true,执行循环中的代码块,然后再执行条件表达式看是否为true,如果为true就再执行循环中的代码,一直这样走,直到遇到条件表达式为false的情况。
while循环的三个要素:- while外部要有起始值
- while要有条件
- while内部始终要想办法将while中的条件改为false。
案例:
- 打印
1-100
之间的整数。 - 打印
1-100
之间的偶数。 - 计算1到100的和。
- 计算
1-100
之间所有偶数的和 - 计算100的阶乘 100!(就是
1*2*3...*100
)
注意:
- while循环里面可以写true,但是注意死循环。
- while循环通常用来做条件循环。
- 循环是可以相互嵌套的,实际应用当中嵌套不应该超过3层。
-
for循环
格式:
for (表达式1;表达式2;表达式3) { 代码块; }
表达式1用来做初始化条件
表达式2用来做条件表达式
表达式3通常用来做自增条件(结束条件)、自增或自减
for (var num = 1; num <= 3 ;num++) { console.log(num); }
- 执行表达式1,
num = 1
- 执行表达式2,判断条件是否成立
1<=3
,true - 执行当前的代码块中的代码,打印num,1。
- 执行表达式3,进行自增。执行完之后
num=2
- 再执行表达式2判断条件是否成立
2<=3
,true。 - 执行当前的代码块中的代码,打印num,2
- 再执行表达式3进行自增,执行完成后
num=3
- 再执行表达式2,判断条件是否成立
3<=3
,true。 - 打印当前的代码块中的代码,打印num,3
- 执行表达式3进行自增,
num=4
4<=3
,表达式2,false。- 终止循环执行。
表达式1只执行了一次。
for循环通常用来做计数循环。
- 执行表达式1,
for循环也是可以嵌套的。
-
do...while循环
不常用。
do{ 要循环执行的代码。 }while(条件表达式);
第一步先执行do中的语句,然后检查条件表达式是否成立,如果成立true则继续执行do内的代码。
不管怎么样do…while循环都会最少执行一次。
特殊的流程控制语句
-
break:
- 作用1:在switch中使用break跳出当前的switch语句。
- 作用2:在循环中使用,跳出离他最近的一层循环,break下面的代码不执行了。
-
continue:
结束本次循环,调用continute之后本次循环剩下的代码不执行了,直接进入到下次循环。
案例:
-
输出1~100的质数(一个数,如果只有1和它本身两个因数,这个数就是质数。但是1不是质数。) 重要
-
求100~999之间的 百位数的三次方+十位数的三次方+个位数的三次方 正好等于这个数的数值。
abc = a^3 + b^3 + c^3