js 关于运算顺序的问题

先介绍涉及到的概念

表达式:js中的短语,解释器在遇到表达式时,会将短语进行计算,然后再参与到运算中,表达式即js中的短语。

j所有的s代码都是由操作符和表达式组成的,因此除了操作符,其他的都是js中的表达式。

如1 + 1 这段代码中,+是操作符,前面的1和后面的1都是表达式。

表达式的分类:

原始表达式:常量(如π)、变量、直接量(数字、字符串、正则表达式)、关键字

初始化表达式:初始化对象和初始化数组

函数定义表达式:

函数调用表达式:

属性访问表达式:

对象创建表达式:使用new操作符创建函数

优先级:

优先级由高至低顺序:属性访问、一元操作符、乘除、加减、比较(<,>等)、判断相等(==,===,!==,!=)、与、或、三目运算、赋值运算

总结:属性访问表达式拥有最高优先级,其次是以操作符(new也属于一元操作符),优先级最低的是赋值运算。

例子:

var a = 3;
++a == 3;//false

上面的例子的结果是数值还是布尔类型,取决于运算的优先级,如果先进行判断a == 3,然后再执行++操作,那么结果是 a = 2,如果是先执行++运算,再判断a == 3,结果是false.

结和性:(优先级相同时看结合性)

分为左结合和右结合,

js中遵循右结合的有:一元操作符、三目运算、赋值运算,

其他所有都是遵循左结合的。

例子:

var a = 3;
!a++;

上面的例子中有两个操作符,一个是!,另一个是++,这两个都是一元操作符,如果从左至右进行计算,那结果是1;但是一元操作符是遵循右结合的,也就是说这个语句会先进行a++运算,然后再对a进行取非运算,结果是false.

再来一个例子:

x = a ? b : c ? d : e ? f : g

我看到的时候是很懵的,虽然应该不会有人这么写,但是这种写法是可以存在的,所以我们也要知道是怎么执行的,三目运算也是右结合性的,所以上面的例子等价于:x = a ? b : (c ? d : (e ? f : g )) 

最后是运算顺序:

js中的表达式包含表达式时,运算顺序是从左至右。

var a = 1;
b = a++ + a;

 

var  a = 1;
b = a++ + ++a;

猜猜上面两个例子中执行后a和b分别等于什么

posted @ 2017-09-29 13:20  蝴蝶纷飞-le  阅读(836)  评论(0编辑  收藏  举报