一、运算符和表达式
1. 运算符
- 运算符就是进行运算的符号,如+、-、*、/等
- 运算符一起运算的数据(直接量、变量、表达式),称为该运算符的操作数
2. 表达式
- 数据与运算符可以共同组成一个表达式,表达式有个计算结果,成为表达式的值
- 一个直接量、一个变量是最简单的表达式,称为原始表达式
- 多个简单表达式可以组成一个复杂的表达式
- 有些表达式具有副作用,表达式的计算过程中会修改操作数的值,运算符决定表达式有没有副作用
二、运算符的分类
1. 按照运算符需要的操作数的个数
一元运算符(一目运算符)
二元运算符(二目运算符)
三元运算符(三目运算符)
2. 按照运算符的功能
- 算术运算符
- 关系运算符(比较运算符)
- 逻辑运算符
- 位运算符(很少用)
- 赋值运算符
- 其他运算符
三、运算符具体功能
1. 算术运算符
| 运算符 | 含义 | 操作数个数 | 操作数类型要求 | 表达式值得类型 | 有无副作用 |
|---|---|---|---|---|---|
| + | 相加 | 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类型
var numStr = " 123.09 "; var bol = true; console.log(+numStr); //123.09 console.log(+bol); //1 console.log(+ 'num'); //NaN -
+什么时候是正号?什么时候是加号?
如果只有一个操作数表示正号,如果有两个操作数,表示相加
-
累加累减运算符在前和在后的区别
在前表示表达式是操作的累加或累减后的值;在后表示表达式是操作的累加或累减前的值
var num = 45; console.log(++num); //46 num=46 console.log(num++); //46 num=47 console.log(num--); //47 num=46 console.log(--num); //45 num=45 console.log(num); //45
2. 关系运算符(比较运算符)
| 运算符 | 含义 | 操作数个数 | 操作数类型要求 | 表达式值的类型 | 有无副作用 |
|---|---|---|---|---|---|
| 大于 | 2 | number(除了两个都是string) | boolean | 无 | |
| >= | 大于等于 | 2 | number(除了两个都是string) | boolean | 无 |
| < | 小于 | 2 | number(除了两个都是string) | boolean | 无 |
| <= | 小于等于 | 2 | number(除了两个都是string) | boolean | 无 |
| == | 相等 | 2 | number(除了两个都是string) | boolean | 无 |
| != | 不相等 | 2 | number(除了两个都是string) | boolean | 无 |
| === | 全等 | 2 | 不要求 | boolean | 无 |
| !== | 不全等 | 2 | 不要求 | boolean | 无 |
-
全等判断和相等判断的区别:
-
相等判断
如果两个操作数类型不一致,会进行隐式转换转为number再进行比较
(
=表示赋值并不是相等,注意和==区分) -
全等判断
如果两个操作数类型不一致,直接判断为不全等 只有数据类型一致且值一致才能判定为全等
console.log(1 == '1'); //true console.log(1 === '1'); //false -
-
字符串比较大小的规则:
- 字符串之间比较大小,逐个字符进行比较,如果第一位字符大,整个字符串都大
- 字符按照对应的unicode编码进行比较
-
null与其他数据判断相等和不相等(特殊):
和其它类型数据比较没有转成number
console.log(null == undefined); //true console.log(null == 0); //false console.log(null == ''); //false console.log(null == false); //false console.log(null === undefined);//false
3. 逻辑运算符
| 运算符 | 含义 | 操作数个数 | 操作数类型要求 | 表达式值的类型 | 有无副作用 |
|---|---|---|---|---|---|
| && | 逻辑与 | 2 | boolean | 两个操作数中的一个 | 无 |
| || | 逻辑或 | 2 | boolean | 两个操作数中的一个 | 无 |
| ! | 逻辑非 | 1 | boolean | boolean | 无 |
-
逻辑与运算符
&&组成的表达式的值:- 如果第一个操作数成立,取第二个操作数作为表达式的值。
- 如果第一个操作数不成立,取第一个操作数作为表达式的值,第二个操作数不会被执行。
console.log(1 && 2); //2 console.log(undefined && 2);//undefined console.log(1 && undefined);//undefined console.log('' && 3); //'' console.log(true && false); //false -
逻辑或运算符
||组成的表达式的值:- 如果第一个操作数成立,取第一个操作数作为表达式的值,第二个操作数不会被执行
- 如果第一个操作数不成立,取第二个操作数作为表达式的值
console.log(1 || 2); //1 console.log(undefined || 2);//2 console.log(1 || undefined);//1 console.log('' || 3); //3 console.log(true || false); //true -
逻辑非
不管操作数是什么,一定是boolean,且没有副作用
console.log(!true); //false console.log(!100); //false console.log(!NaN); //true console.log(!''); //true console.log(!'a'); //false console.log(!undefined);//true console.log(!null);//true
4. 位运算符
| 运算符 | 含义 | 操作数个数 | 表达式值的类型 | 有无副作用 |
|---|---|---|---|---|
| & | 按位与运算符 | 2 | interger | 无 |
| | | 按位或运算符 | 2 | interger | 无 |
5. 赋值运算符
| 运算符 | 含义 | 操作数个数 | 操作数类型要求 | 组成的表达式的值的类型 | 有无副作用 |
|---|---|---|---|---|---|
| = | 赋值 | 2 | 无 | 任意可能 | 有 |
| += | 相加赋值 | 2 | 无 | 任意可能 | 有 |
| -= | 相减赋值 | 2 | 无 | 任意可能 | 有 |
| *= | 相减赋值 | 2 | 无 | 任意可能 | 有 |
| /= | 相减赋值 | 2 | 无 | 任意可能 | 有 |
| %= | 相减赋值 | 2 | 无 | 任意可能 | 有 |
| += | 相减赋值 | 2 | 无 | 任意可能 | 有 |
- 赋值运算符会对左边的运算符产生副作用
- 被副作用的操作数必须是变量的形式,没有被副作用的操作数可以是任意形式
- 赋值运算符组成的表达式的值:左边操作数被重新赋值之后的结果作为表达式的值
var a = 1;
a += 2; //a = a + 2
console.log(a); //3
6. 其他运算符
| 运算符 | 含义 | 操作数个数 | 操作数类型要求 | 组成的表达式的值的类型 | 有无副作用 |
|---|---|---|---|---|---|
| typeof | 类型判断 | 1 | 无 | string | 无 |
| , | 逗号运算符 | 2 | 无 | 第二个操作数作为表达式的值 | 无 |
| + | 字符串连接符 | 2 | string | string | 无 |
| ? : | 比较判断 | 3 | 第一个操作要求boolean | 从第二个操作数和第三 | 无 |
-
+什么时候是 加号、字符串连接符或者正号?- 如果只有一个操作符,表示正号
- 如果两个操作数,其中只要有一个是string,+表示字符串连接符
- 如果两个操作数,都不是string,表示相加
-
条件运算符组成的表达式的取值规则:
操作数1 ? 操作数2 : 操作数3
- 如果操作数1成立,取操作数2作为表达式的值,操作数3不会被执行到
- 如果操作数1不成立,取操作数3作为表达式的值,操作数2不会被执行到
四、 运算符优先级
- 一元运算符优先级最高
- 算数运算符 乘除取余 > 加减、字符串连接
- 关系运算符 比大小 > 判等
- 逻辑运算符 && > ||
- 三元运算符 ? :
- 赋值运算符
- 逗号运算符