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分别等于什么