学习javascript中的运算符
运算符
运算符通常用于算数表达式,逻辑表达式,赋值表达式,比较表达式,属性访问等等表达式运算。
运算符是有计算优先级的,先计算优先级高的。
下表从高到低列出了几乎所有的运算符!
| 运算符 | 描述 | 结合性 | 操作数的个数 | 优先级 |
|---|---|---|---|---|
| () | 小括号,分组运算 | 1 | 21 | |
| . | 点运算符、成员访问 | L | 2 | 20 |
| [] | 动态成员访问 | L | 2 | 20 |
| new(...) | 带参数;创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。 | 2 | 20 | |
| fun() | 函数调用 | L | 2 | 20 |
| ?. | 可选链 | L | 2 | 20 |
| new() | 不带参数;创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。 | 1 | 19 | |
| ... ++ | 后置递增 | 1 | 18 | |
| ... -- | 后置递减 | 1 | 18 | |
| ++ ... | 前置递增 | R | 1 | 17 |
| -- ... | 前置递减 | R | 1 | 17 |
| - | 将操作数转换为Number类型并取反 | R | 1 | 17 |
| + | 把操作数转换为Number类型 | R | 1 | 17 |
| ~ | 按位求反 | R | 1 | 17 |
| ! | 逻辑非 | R | 1 | 17 |
| delete | 删除属性 | R | 1 | 17 |
| typeof | 检测操作数类型 | R | 1 | 17 |
| void | 返回undefined | R | 1 | 17 |
| ** | 幂运算符 | R | 2 | 16 |
| *,/,% | 乘,除,模 | L | 2 | 15 |
| +,- | 加,减 | L | 2 | 14 |
| + | 连字符 | L | 2 | 14 |
| << | 按位左移 | L | 2 | 13 |
| >> | 按位右移 | L | 2 | 13 |
| >>> | 按位无符号右移运算符 | L | 2 | 13 |
| <,<=,>,>= | 比较运算符 | L | 2 | 12 |
| in | 判断对象是否拥有给定属性 | L | 2 | 12 |
| instanceof | 判断一个对象是否是另一个对象的实例。 | L | 2 | 12 |
| == | 判断相等 | L | 2 | 11 |
| != | 判断不相等 | L | 2 | 11 |
| === | 判断恒等于 | L | 2 | 11 |
| !== | 判断非恒等于 | L | 2 | 11 |
| & | 按位与 | L | 2 | 10 |
| 按位异或 | L | 2 | 9 | |
| | | 按位或 | L | 2 | 8 |
| && | 逻辑与 | L | 2 | 7 |
| || | 逻辑或 | L | 2 | 6 |
| ?? | 空值合并运算符,如果 ?? 前面是 null 或 undefined,取后面的默认值 | L | 2 | 5 |
| ...?...:... | 三元运算符 | R | 3 | 4 |
| = | 赋值运算符;返回右边的值 | R | 2 | 3 |
| yield,yield * | R | 1 | 2 | |
| , | 逗号操作符允许在一个判断状态中有多个表达式去进行运算并且最后返回最后一个表达式的值 | L | 2 | 1 |
备注:R:右结合性,L:左结合性
+运算符既是一元运算符、也是二元运算符,既可以用于Number的计算、也可以用于String的连接
<,<=,>,>=比较运算符、可以用于数字间的比较、也可以用于字符的比较
=>不是运算符,而是箭头函数的表示符。
结合性
结合性,指的是按左或者右顺序计算,一般在具有多个相同优先级的运算符的表达式才有效果!
不同优先级的、则直接按优先级来计算,也就不考虑结合性了!
-
左结合性
运算符的左边的表达式用()包起来
-
右结合性
运算符的右边的表达式用()包起来
例子1:
a=b+c+d
//由于加法运算符具有左结合性、所以等同于
a=((b+c)+d)
例子2:
var a=b=c=8;
//赋值运算符具有右结合性,所以等同于
var a=(b=(c=8));
//c=8
//b=8,因为c=8的值为8
//a=8
例子3:
+!8
//~,!具有相同的优先级,而!是右结合性,+是左结合性,所以等同于
+(!8)
一元,二元,三元运算符
所谓的运算符一元、二元、三元,指的是表达式或操作数的个数!
比如:
- 一元运算符(作用于单独的操作数,产生新的值,一般优先级比较高,都是右结合性)
-1,typeof x,i++;
- 二元运算符
1+1,a=3
- 三元运算符
a?c:d
运算顺序
表达式的计算结果受运算符的优先级、结合性影响!
我们通过一个例子来解析一下!
比如:
var x=0;
var y=(x++)+!x;
解析
牢记:js总是从左往右计算
var x=0;这行语句先不看;
直接看
y=(x++)+!x;先用结合性来分组:
y=(x++)+(!x)第一步:计算
y,第二步:计算
x++,(结果为0,记为a),(第二部执行完后
x=1)第三步:计算
!x,(结果为false,记为b)第四步:计算
a+b,(结果为0,记为c),因为0+false,false转成数字0,0+0=0第五步:将c赋值给y
所以
y=0
总结
js中的运算符还是比较多的!记住运算符的优先级、结合性!可以更好的理解js的计算!有助于我们写出更优秀的代码!