学习javascript中的运算符

494 阅读4分钟

学习javascript中的运算符

运算符

运算符通常用于算数表达式,逻辑表达式,赋值表达式,比较表达式,属性访问等等表达式运算。

运算符是有计算优先级的,先计算优先级高的。

下表从高到低列出了几乎所有的运算符!

运算符描述结合性操作数的个数优先级
()小括号,分组运算121
.点运算符、成员访问L220
[]动态成员访问L220
new(...)带参数;创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。220
fun()函数调用L220
?.可选链L220
new()不带参数;创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。119
... ++后置递增118
... --后置递减118
++ ...前置递增R117
-- ...前置递减R117
-将操作数转换为Number类型并取反R117
+把操作数转换为Number类型R117
按位求反R117
逻辑非R117
delete删除属性R117
typeof检测操作数类型R117
void返回undefinedR117
**幂运算符R216
*,/,%乘,除,模L215
+,-加,减L214
+连字符L214
<<按位左移L213
>>按位右移L213
>>>按位无符号右移运算符L213
<,<=,>,>=比较运算符L212
in判断对象是否拥有给定属性L212
instanceof判断一个对象是否是另一个对象的实例。L212
==判断相等L211
!=判断不相等L211
===判断恒等于L211
!==判断非恒等于L211
&按位与L210
按位异或L29
|按位或L28
&&逻辑与L27
||逻辑或L26
??空值合并运算符,如果 ?? 前面是 null 或 undefined,取后面的默认值L25
...?...:...三元运算符R34
=赋值运算符;返回右边的值R23
yield,yield *R12
,逗号操作符允许在一个判断状态中有多个表达式去进行运算并且最后返回最后一个表达式的值L21

备注: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的计算!有助于我们写出更优秀的代码!