webveuje/js/kejian/day3.md

112 lines
2.8 KiB
Markdown
Raw Normal View History

2021-01-28 01:06:45 +00:00
# 运算符
## 术语
**运算元** ——运算符应用的对象 比如说 5*2 有两个运算元 左运算元5 和 右运算元2
如果一个运算符只对应一个运算元 那么就是一元运算符 如果一个运算符 对应两个运算元 那么他就是二元运算符
## 数学运算符
* 加 +
* 减 -
* 乘 *
* 除 /
* 取余 %
### +
1. 用来做加的数学运算
2. 如果被应用于字符串 就用来字符串连接
3. 作为一元运算符的时候 确定数值正负
## 运算符优先级
下表按从最高到最低的优先级列出JavaScript运算符。具有相同优先级的运算符按从左至右的顺序求值。
|运算符|优先级|
| ---- | ----|
|. [] ()|字段访问、数组下标、函数调用以及表达式分组|
|++ -- - ~ ! delete new typeof void|一元运算符、返回数据类型、对象创建、未定义值|
|* / %| 乘法、除法、取模|
|+ - +| 加法、减法、字符串连接|
|<< >> >>>|移位|
|< <= > >= instanceof|小于、小于等于、大于、大于等于、instanceof|
|== != === !==|等于、不等于、严格相等、非严格相等|
|&| 按位与|
|^| 按位异或|
|\|| 按位或|
|&&|逻辑与|
| \|\| |逻辑或|
|?:| 条件|
|=、+=、-=、*=、/=、%=、&=、\|=、^=、<<=、>、>=、>>=| 混合赋值运算符 |
|,|逗号运算符|
## 赋值运算符 =
```=``` 是一个运算符 会返回一个值
``` x=5 ``` 的执行分为两步
把5给x
返回x的值
思考 ```let a=1; let b=2; let c=3-(a=b+1)``` 的执行过程
<details>
<summary>点击查看答案</summary>
根据运算符优先级规则,先运算()里面的a=b+1
对于 a=b+1, +的优先级大于= 所以先运算b+1
b的值为2 所以=把b+1 也就是2+1的结果给a 并返回赋值后a的值 3
接下来运算c=3-(...) 加减运算优先级大于赋值运算,所以 ()里运算的结果为3 所以 3-3=0
最终执行c=0 即把后面运算的结果0给c 然后 返回赋值后的c的值 0
注: 为了代码的可读性 应不要写这样的代码
</details>
### 链式赋值
```
a = b = c = 2 + 2;
```
链式赋值从右到左进行计算。首先,对最右边的表达式 2 + 2 求值然后将其赋给左边的变量c、b 和 a。最后所有的变量共享一个值。
上面的代码和下面的是一样的:
```
c = 2 + 2;
b = c;
a = c;
```
## 运算同时赋值
这是把运算符和赋值两个操作的缩写形式
原来的:
```
let n = 2;
n = n + 5;
n = n * 2;
```
现在可以用+=-+, *=, /=, %= ...来对上面的代码进行缩写
现在:
```
let n=2
n+=5
n*=2
alert(n)
```
这类运算符的优先级与普通赋值运算符的优先级相同,所以它们在大多数其他运算之后执行:
```
let n = 2;
n *= 3 + 5;
alert( n ); // 16 (右边部分先被计算,等同于 n *= 8
```
## 自增、自减
* 自增
* 自减