运算符
运算符和表达式
① 运算符
sh
1. 运算符就是参与运算的符号,像+、-、*、/ 等。
2. 与运算符一起运算的数据称之为操作数。
② 表达式
sh
1. 数据、运算符可以共同组成一个表达式
2. 表达式具有计算结果,称为表达式的值
3. 一个变量、一个直接量也可以算作表达式,称为原始表达式
4. 多个简单的表达式可以组成复杂的表达式
5. 有些表达式具有副作用,除了能得到表达式的计算结果,会被参与运算符的操作数进行修改,表达式有没有副作用由运算符决定。
运算符的分类
① 按照运算符需要的操作数的个数
sh
一元运算符
二元运算符
三元运算符
② 按照运算符的功能
sh
1. 算术运算符
2. 关系运算符、比较运算符
3. 逻辑运算符
4. 位运算符
5. 赋值运算符
6. 其他运算符
运算符讲解(按照功能)
① 算术运算符
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
+ | 相加 | 2 | number | number | 无 |
- | 相减 | 2 | number | number | 无 |
* | 相乘 | 2 | number | number | 无 |
/ | 相除 | 2 | number | number | 无 |
% | 取余 | 2 | number | number | 无 |
+ | 正号 | 1 | number | number | 无 |
- | 负号 | 1 | number | number | 无 |
++ | 累加 | 1 | number | number | 有 |
-- | 累减 | 1 | number | number | 有 |
+
什么时候是正号?什么时候是相加?
sh
1. 如果操作数个数是1个,+ 是正号
2. 如果操作数个数是2个,+ 是加号
关于表达式的副作用:
sh
表达式除了得到计算结果,还会对操作数进行修改
如果发生数据类型自动转换,操作数只能将转完了类型的数据参与运算,而操作数本身没有变化
有副作用的表达式,要求操作数必须是变量的形式!
累加累加减: 运算符在前和在后的区别:
sh
操作数在前, 操作数数没有累加累减前的值作为表达式的值
运算符在前, 操作数累加累减之后的值作为表达式的的值
② 关系运算符(比较运算符)
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
> | 大于 | 2 | number、string | boolean | 无 |
>= | 大于等于 | 2 | number、string | boolean | 无 |
< | 小于 | 2 | number、string | boolean | 无 |
<= | 小于等于 | 2 | number、string | boolean | 无 |
== | 相等 | 2 | 俩操作数类型不一致转number 类型一致直接看是否相同 | boolean | 无 |
!= | 不相等 | 2 | 俩操作数类型不一致转number 类型一致直接看是否相同 | boolean | 无 |
=== | 全等 | 2 | 没有要求 | boolean | 无 |
!== | 不全等 | 2 | 没有要求 | boolean | 无 |
副作用:要求操作数必须是变量的形式
字符串比较大小的规则:
css
1. 如果两个操作数都是 string,才会按照字符串的规则比较大小
2. 字符串按照顺序,一个字符一个字符的比较,对应的字符大,整个字符串都大,后面的字符不再比较
3. 字符使用它的unicode编码比较大小, 如 a是97、A是65
null 与其他数据判断相等和不相等(特殊):
js
null == ''; // false
null == 0; // false
null == false; // false
null == undefined; // true
全等判断和相等判断的区别:
css
相等判断: 如果两个操作数类型不一致,转为number 再比较
全等判断: 如果两个操作数类型不一致,直接判定为不全等,不会发生数据类型自动转换
③ 逻辑运算符
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
&& | 逻辑与 | 2 | boolean | 取两个操作数中的一个 | 无 |
|| | 逻辑或 | 2 | boolean | 取两个操作数中的一个 | 无 |
! | 逻辑非 | 1 | boolean | boolean | 无 |
逻辑与运算符组成的表达式的值:
sh
如果第一个操作数成立,取第二个操作作为表达式的值
如果第一个操作数不成立,取第一个操作作为表达式的值,第二个操作不会被执行到
逻辑或运算符组成的表达式的值:
sh
如果第一个操作数成立,取第一个操作数作为表达式的值,第二个操作数不会被执行到
如果第一个操作数不成立,取第二个操作数作为表达式的值
使用案例
ts
if (!record.children?.length) {// record没有children属性或者record.children 数组的长度是 0,匹配判断,逻辑判断
console.log(1111)
}
④ 赋值运算符
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
= | 赋值 | 2 | 无要求 | 取左边操作数重置赋值之后的值 | 有 |
+= | 相加赋值 | 2 | number | 取左边操作数重置赋值之后的值 | 有 |
-= | 相减赋值 | 2 | number | 取左边操作数重置赋值之后的值 | 有 |
*= | 相乘赋值 | 2 | number | 取左边操作数重置赋值之后的值 | 有 |
/= | 相除赋值 | 2 | number | 取左边操作数重置赋值之后的值 | 有 |
%= | 取余赋值 | 2 | number | 取左边操作数重置赋值之后的值 | 有 |
+= | 字符连接赋值 | 2 | string | 取左边操作数重置赋值之后的值 | 有 |
css
赋值运算符左边的操作数必须是变量的形式, 右边的操作数可以是直接量、变量、表达式。
⑤ 其他运算符
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
typeof | 类型判断 | 1 | 无要求 | string | 无 |
, | 逗号 | 2 | 无要求 | 取第二个操作数作为表达式的值 | 无 |
+ | 字符串连接符 | 2 | string | string | 无 |
?: |
+ 什么时候是 相加、字符串连接符或者正号?
sh
1. 如果只有一个操作数, + 表示正号
2. 如果有两个操作数,其中只要有一个操作数是string,+ 表示字符串连接符
3. 如果有两个操作数,两个操作数都不是string,+ 表示相加
条件运算符组成的表达式的取值规则:
⑥条件运算符详解
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
? : | 条件运算符 | 3 | 第一个布尔 后两个无要求 | 取第二个第三个其中的一个 | 无 |
条件运算符(三元运算符)组成的表达式的取值规则:
css
如果第一个操作数成立,取第二个操作数作为表达式的值
如果第一个操作数不成立,取第三个操作数作为表达式的值
运算符的优先级
css
1. 一元运算符
2. 算术运算符 乘除取余>加减
3. 关系(比较)运算符 比大小 > 判等
4. 逻辑运算符 && > ||
5. 三元运算符
6. 赋值运算符
7. 逗号运算符
通过小括号提高优先级!