1 运算符
1.1 运算符和表达式
① 运算符
运算符就是参与运算的符号,像+
、-
、*
、/
等。
与运算符一起运算的变量、直接量、表达式称之为操作数。
② 表达式
-
表达式是变量或者直接量与运算符组成的式子,表达式会有一个计算结果,称之为表达式的值,也就是说表达式是有值的。
-
最简单的表达式是"原始表达式", 如 直接量、 变量名、 关键字等。
-
复杂表达式由简单表达式组成, 运算符何以将简单表达式组合成复杂表达式。
-
注意带有副作用的表达式,这样的表达式除了有表达式的计算结果之外,还会对表达式中的变量产生影响。
1.2 运算符的分类
① 按照运算符需要的操作数的个数
一元运算符/一目运算符
二元运算符/二目运算符
三元运算符/三目运算符
② 按照运算符的功能
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
其他运算符
1.3 运算符讲解(按照功能)
① 算术运算符
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
+ | 加号 | 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 | 有 |
正号运算符:
通常会使用正号运算符来把其他类型的数据转为 number 类型,利用运算符自动类型转换。
累加运算符和累减运算符:
累加和累减都是一元运算符,操作数必须以变量的形式表示,具有副作用。
累加和累减的符号可以在操作数的前面也可以在操作数的后面,对操作数产生的副作用是一样的,但是所组成的表达式的值不同。
运算符在操作前面: 表单式取操作数累加或累减之后的值作为表达式的值。
运算符在操作数后面:表达式取操作数累加或累减之前的值作为表达式的值。
② 关系运算符(比较运算符)
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
> | 大于 | 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 | 无 |
两个操作数比较大小的规则:
- 如果两个操作的类型不一致,各自自动转为 number 类型进行比较。
- 如果两个操作数都是 string 类型,按照 string 类型比较大小的规则进行比较。
string 类型的数据比较大小的规则:
- 比较的是字符对应的 unicode 编码,unicode 编码是数字,可以比较大小。
- 字符串比较是按位一位一位的比较,如果一个操作数第一位的字符比另外一个操作第一位字符的unicode编码大,该操作整体都大。
相等和不相等的判断规则:
- 如果两个操作数类型不一致,自动转为 number 之后进行比较。
- 如果两个操作数类型一致,直接看是不是一样的。
全等和不全等的判断规则:
- 如果两个操作数类型不一致,直接返回 false,不会进行自动类型转换的。
- 如果两个操作数类型一致,比较是否一样。
null 进行相等(==)判断的时候,非常特殊:
console.log(null == null); // true console.log(null == 0); // false console.log(null == false); // false console.log(null == ''); // false console.log(null == undefined); // true
③ 逻辑运算符
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
&& | 逻辑与 | 2 | 任何类型 | 取其中一个操作数作为表达式的值 | 无 |
|| | 逻辑或 | 2 | 任何类型 | 取其中一个操作数作为表达式的值 | 无 |
! | 逻辑非 | 1 | boolean | boolean | 无 |
逻辑与组成的表达式的值的计算规则:
- 如果第一个操作数不成立,取第一个操作数作为表达式的值。
- 如果第一个操作数成立,取第二个操作数作为表达式的值。
逻辑或组成的表达式的值的计算规则:
- 如果第一个操作数不成立,取第二个操作数作为表达式的值。
- 如果第一个操作数成立,取第一个操作数作为表达式的值。
④ 赋值运算符
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
= | 赋值 | 2 | 无要求,左边的操作数必须是变量 | 变量(左边操作数)的值作为表达式的值 | 有 |
+= | 赋值求和 | 2 | 无要求,左边的操作数必须是变量 | 变量(左边操作数的值作为表达式的值 | 有 |
-= | 赋值求差 | 2 | 无要求,左边的操作数必须是变量 | 变量(左边操作数的值作为表达式的值 | 有 |
*= | 赋值求积 | 2 | 无要求,左边的操作数必须是变量 | 变量(左边操作数的值作为表达式的值 | 有 |
/= | 赋值求商 | 2 | 无要求,左边的操作数必须是变量 | 变量(左边操作数的值作为表达式的值 | 有 |
%= | 赋值求余 | 2 | 无要求,左边的操作数必须是变量 | 变量(左边操作数的值作为表达式的值 | 有 |
+= | 赋值连接 | 2 | string,左边的操作数必须是变量 | 变量(左边操作数的值作为表达式的值 | 有 |
总结:
- 赋值运算符要求左边的操作数必须是变量,右边的操作数变量、直接量、表达式都可以。
- 赋值运算符都有副作用,使用的就是赋值运算符的副作用,左边操作数会被修改。
- 赋值运算符组成的表达式以左边操作数为值(修改过后的)。
⑤ 其他运算符
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
typeof | 判断数据的类型 | 1 | 任意类型 | string | 无 |
, | 逗号 | 2 | 无 | ||
+ | 字符串连接符 | 2 | string | string | 无 |
?: | 比较运算符 | 3 | 任意类型 | 取第二个操作数或者第三个操作数作为表达式的值 | 无 |
+ 符合具有3个含义:
- 如果操作数只有一个,+ 表示正号运算符。
- 如果操作数两个,且没有任何一个操作数是字符串,+ 表示加号。
- 如果操作数连个,只要有一个操作数是字符串,+ 表示字符串连接符。
?:三元运算符组成的表示的值的规则:
- 如果第一个操作数成立,取第二个操作数作为表达式的值。
- 如果第一个操作数不成立,取第三个操作数作为表达式的值。
1.4 运算符优先级
1、 一元运算符: ++ -- ! typeof
2、 乘除取余、加减
3、 关系运算符
4、 逻辑运算符
5、 赋值运算符
6、 ?:
注意: 使用 () 可以提高优先级。