日期:2023-03-24 学习目标:流程控制
运算符
概述
操作符和操作数 操作符:运算符,参与运算的符号,操作符不一定只有一个符号 操作数:参与运算的数据,也称之为“元”
一些常见操作符
=
:赋值符号,将右边的数据赋值给左边.
: 访问符号,用于访问对象的属性[]
:访问符号,用于访问对象的属性()
:函数调用
运算符的分类
- 按照操作数的数量区分:
一元运算符:
.
、()
、[]
、正号(+)
、负号(-)
、非(!)
二元运算符:加(+)
、减(-)
、乘(*)
、除(/)
、取余(%)
、赋值(=)
三元运算符:条件运算符条件 ? 表达式1 : 表达式2
- 按照功能区分: 算术运算符(数学) 比较运算符 逻辑运算符 位运算符 其他
表达式 表达式 = 操作符 + 操作数 每个表达式都有一个运算结果,该结果叫做返回值,返回值的类型叫做返回类型
所有的表达式都可以当作数据使用
常见表达式的返回值和类型:
使用的运算符 | 表达式 | 返回值 | 返回值的类型 |
---|---|---|---|
= | 赋值表达式 | 赋值的结果 | |
+ | 字符串拼接表达式 | 拼接成的字符串 | string |
. | 访问表达式 | 所访问属性的值 | |
[ ] | 访问表达式 | 所访问属性的值 | |
( ) | 函数调用表达式 | 结果取决于函数的运行 | |
+ - * / % | 算术表达式 | 算术运算的结果 | number |
> < >= <= == === != !== | 比较表达式 | 比较结果(true/false) | boolean |
&& || ! | 逻辑判断表达式 | 判断结果(true/false) | boolean |
如果是一个声明+赋值的表达式,返回结果为undefined。
console.log函数调用的返回结果为undefined。
chrome浏览器控制台的环境是REPL环境 REPL:Read Eval Print Loop,读-执行-打印-循环 当直接在控制台书写代码时,除了运行代码之外,还会输出该表达式的返回值
算术运算符
算术运算符 | 作用 |
---|---|
+ | 求和 |
- | 求差 |
* | 求积 |
/ | 求商 |
% | 取余 |
算术运算中的一些细节
-
数字运算是不精确的
-
当除数为0时
正数/0 得到结果Infinity(正无穷)
负数/0 得到结果-Infinity(负无穷)
0/0 得到结果NaN
-
求余时,余数的符号余被除数相同
非数字类型使用算术运算符时
-
当使用除加号外的算术运算符时
允许时,浏览器会将原始类型转换为数字类型(隐式转换),然后进行计算
-
boolean: true→1,false→0
-
string:
字符串内是正确的数字→数字,
字符串内为非数字→NaN
字符串内为Infinity→Infinity,
空字符串→0
字符串转换时会忽略前后空格
-
null: null→0
-
undefined: undefined -> NaN
-
object:
将对象类型先转换为字符串类型,然后再将该字符串转换为数字类型
object-> "[object Object]" -> NaN
-
-
加号运算符
-
加号一边有字符串,含义变为字符串拼接
将另一边的其他类型,转换为字符串
数字 -> 数字字符串 boolean -> boolean字符串 null -> "null" undefined -> "undefined" 对象 -> "[object Object]"
-
加号两边都没有字符串,但一边有对象,将对象转换为字符串,然后按照上面的规则进行
-
其他情况和上面的数学运算一致
-
NaN虽然是数字类型,但它和任何数字作任何运算所得到得到的结果都是NaN
赋值运算符
赋值运算符:对变量赋值的运算符
运算符 | 作用 |
---|---|
= | 赋值 |
+= | 加法赋值 |
-= | 减法赋值 |
*= | 乘法赋值 |
/= | 除法赋值 |
%= | 取余赋值 |
例:
let a = 1
a += 1 //等价于a=a+1
a *= 2 //等价与a=a*2
自增/自减运算符
自增运算符:
- 符号:++
- 作用:让变量加1 自减运算符:
- 符号:--
- 作用:让变量减1
- 前置自增
let i = 1
++i
console.log(i) //结果为2
- 后置自增
let i = 1
i++
console.log(i) //结果为2
- 前置自增和后置自增的区别[仅做了解] 前置自增和后置自增单独使用时没有区别,当参与运算时会有区别
- 前置自增(++i),先自加再参与运算
let i = 1
console.log(i) //1
console.log(++i + 1) //3
console.log(i) //2
- 后置自增(i++),先参与运算再自加
let i = 1
console.log(i) //1
console.log(i++ + 1) //2
console.log(i) //2
let i = 1
console.log(i) //1
console.log(i++ + ++i + i) //7
console.log(i) //3
比较运算符
比较两个数据大小、是否相等,根据比较结果返回一个布尔值(true / false)
比较运算符 | 作用 |
---|---|
左边是否大于右边 | |
< | 左边是否小于右边 |
>= | 左边是否大于或等于右边 |
<= | 左边是否小于或等于右边 |
=== | 左右两边是否类型 和值 都相等(重点) |
== | 左右两边值 是否相等 |
!= | 左右值是否不相等 |
!== | 左右两边是否不全等 |
console.log(2 > 3) //false
console.log(2 >= 2) //true
console.log(2 == 2) //true
console.log(2 == '2') // true
// 比较运算符有隐式转换,把'2'转换为2再行判断
console.log(2 === '2') //flase ===全等号既判断值也判断类型
console.log(NaN === NaN) //flase NaN 不等于任何人,包括他自己
console.log(undefined === null) //false
console.log(2 !== '2') // true
console.log(2 != '2') // false
//字符串的比较是比较字符对应的ASCII码
console.log('a' < 'b') // true
console.log('aa' < 'ab') // true
console.log('aa' < 'aac') // true
逻辑运算符
符号 | 名称 | 特点 |
---|---|---|
&& | 逻辑与 | 一假则假 |
|| | 逻辑或 | 一真则真 |
! | 逻辑非 | (取反)真变假,假变真 |
运算符优先级
优先级 | 运算符 | 顺序 |
---|---|---|
1 | 小括号 | ( ) |
2 | 一元运算符 | ++ -- ! |
3 | 算术运算符 | 先 * / % 后+ - |
4 | 比较运算符 | > >= < <= |
5 | 相等运算符 | == != === !== |
6 | 逻辑运算符 | 先&& 后 || |
7 | 赋值运算符 | = |
8 | 逗号 | , |
逻辑运算符优先级:
非>与>或
语句
表达式和语句
表达式:表达式是可以被求值的代码,JavaScript引擎会将其计算出一个结果
语句:语句是一段可执行的代码
二者的区别:
-
表达式可以被求值,所以可以卸载赋值语句的右侧;
-
语句不一定有值,所以像是alert()、for、break等语句就不能被用于赋值
分支语句
程序三大流程控制语句:
顺序结构:从上至下依次执行代码
分支结构:根据条件执行代码
循环结构:重复执行某段代码
分支语句
if、三元运算符、switch
if语句
if语句有三种使用:单分支、双分支、多分支
单分支if语句:
if(条件表达式) {
// 满足条件执行此处代码块
}
双分支if语句:
if (条件表达式){
// 满足条件执行此处代码块
} else {
// 不满足条件执行此处代码块
}
多分支if语句:
if(条件1){
// 满足条件1,执行此处代码块
}
else if(条件2){
// 不满足条件1,但满足条件2,执行此处代码块代码块
}
else if(条件3){
// 不满足条件1,不满足条件2,但满足条件3,执行此处代码块
}
//....
else{
// 以上条件都不满足执行此处代码块
}
- 如果某个条件满足,则直接忽略后面的所有条件
- else if 可以有多个(包含0个)
- else可以有1个或0个
- else可以换行,可以不换行
- 如果代码块只有一条语句,可以省略花括号(不推荐)
- if只能出现一次
三元运算符
使用场景: 一些简单的双分支,可以使用 三元运算符(三元表达式),写起来比 if else双分支 更简单,一般用来取值
语法:
条件 ? 表达式1 : 表达式2
例:
let num = prompt('请您输入一个数字:')
// 判断:若num小于10则在其前面补0
num = num < 10 ? 0 + num : num
alert(num)
switch语句
使用场景: 适合于有多个条件的时候,也属于分支语句,大部分情况下和 if多分支语句 功能相同
语法:
switch(表达式){
case 数据1:
代码块
case 数据2:
代码块
//...
default:
代码块
}
例:
switch (2) {
case 1:
console.log('您选择的是1')
break // 退出switch
case 2:
console.log('您选择的是2')
break // 退出switch
case 3:
console.log('您选择的是3')
break // 退出switch
default:
console.log('没有符合条件的')
}
注意:
- 计算表达式的返回值,依次和case后面的数据进行严格相等的比较,如果某个相等,停止比较,然后运行其内部的代码块,再然后,依次运行之后的所有代码块。
- 在case分支内部,使用break语句,可以立即停止switch结构,没有break会造成case穿透
- default在前面的所有case都不匹配时运行。可以省略
- switch case语句一般用于等值判断, if适合于区间判断
- if 多分支语句开发要比switch更重要,使用也更多
断点调试:
断点:在某句代码上加的标记就叫断点,当程序执行到这句有标记的代码时会暂停下来
作用:帮助理解代码的运行,找到bug
用法:浏览器打开调试界面 在sources一栏 ,选择代码文件