# 运算符 ## 术语 **运算元** ——运算符应用的对象 比如说 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)``` 的执行过程
点击查看答案 根据运算符优先级规则,先运算()里面的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 注: 为了代码的可读性 应不要写这样的代码
### 链式赋值 ``` 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) ``` ## 自增、自减 * 自增 * 自减