webveuje/js/kejian/day3.md
2021-02-02 17:27:36 +08:00

112 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 运算符
## 术语
**运算元** ——运算符应用的对象 比如说 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
```
## 自增、自减
* 自增
* 自减