先看几段代码:
var a = 1; var b=(a++)+(a++);//3 var c=(++a)+(++a);//5 var d=(a++)+(++a);//4 var e=(++a)+(a++);//4 var f=++a+(a++);//4 var g=++a+a++;//4
是不是很有意思,这从()的运算优先级大于++这个角度根本无法解释,其实这中间涉及表达式求值顺序问题。
表达式求值顺序不同于运算结合性和优先级。这其中涉及到副作用和顺序点,以前我记得上学那会儿学c语言的时候老师讲过,当时没明白也没当回事,然后在你这看到了,才想起来,感情js也会出现这问题,刚才查了一下,c++啥的也都有,貌似不同的语言编译结果还都会有所不同,这中间涉及的问题就是副作用和顺序点。
回到以上代码,运算的优先级固然要遵循,但是由于副作用,导致a++、++a这些子表达式的执行顺序又是不固定的,所以js的编译器可能是不管有没有括号,先执行++a。
这些都是猜测,我搜javascript的副作用、顺序点等关键词都没搜到相关资料。
总之呢,别这么写代码就对了。。。
总之呢,别这么写代码就对了。。。
参考资料:
http://baike.baidu.com/view/1747175.htm
http://hczhcz.github.io/2014/09/12/side-effects-and-sequence-points.html
https://blog.cuican.name/?p=453
未经允许不得转载:前端撸码笔记 » javascript中求值运算的副作用和顺序点