# 运算符

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

## 自增、自减
* 自增
  
  
* 自减