04-运算符优先级
5.3 运算符优先级
还有一个需要理解的关键地方是,JavaScript会按照运算符的优先级将表达式解析成值。这是了解JavaScript程序工作原理的至关重要的一步。
前面已经介绍了算术运算符,现在先暂停一下关于JavaScript中多种运算符的讨论,来看看它们的优先级。如果上过小学,那么大家就已经接触过运算符的优先级了,只是可能没有意识到。
大家是否还记得小学时解决过的问题(这里提前向那些对数学充满焦虑的同学表示歉意):
8÷2+3× (4×2−1)
如果计算所得的答案是25,说明能正确使用运算符优先级。也就是很清楚需要从括号开始,然后才是先乘除,后加减的顺序。
JavaScript会运用类似的规则解析所有的表达式,而不仅是算术表达式。看到这里大家可能会很开心,因为JavaScript处理算术表达式的方式与小学学到的一样—可能还会有一些助记符,比如“PEMDAS”或者“Please Excuse My Dear Aunt Sally”来帮助记忆。(译者注:PEMDAS: 括号(Parentheses),指数(Exponents),乘法(Multiplication),除法(Division),加法(addition),减法(subtraction)。)
在JavaScript中,除了算术运算符,还有很多其他运算符,需要记住很多东西,这可能不是一个人们喜闻乐见的消息。但也有好消息,因为这些运算符优先级与数学中的一样,括号具有最高优先级:对于一个给定表达式,如果不确定它的运算顺序,总是可以通过添加括号来保证表达式按照想要的顺序执行。
截至目前,JavaScript总共有56种运算符,它们被归类到19个优先等级中。高优先级的运算符先于低优先级的运算符执行。尽管多年来,作者已经慢慢的记住了优先级表(并没有刻意去记),有时仍然会查阅它来巩固记忆,或者了解一门新的编程语言特性中哪些地方能对应上这些优先级。运算符优先级表见附录B。
同一优先级的运算符按照从左到右的顺序执行。例如,乘法和除法的优先级都是14,它们在执行时会按照从左到右的顺序,赋值运算符(优先级13)则是从右到左。有了这些知识,就能弄清楚下面这些表达式的运算顺序了:
let x = 3, y;
x += y = 6*5/2;
// 我们会按照优先级顺序,用括号将下一个运算括起来
// 乘法和出发(优先级为14,从做到右)
// x += y = (6*5)/2
// x += y = (30/2)
// x += y = 15
// 赋值(优先级为13,从右到左):
// x += (y = 15)
// x += 15 (y 的值为 15)
// 18 (x 的值为 18)
刚开始了解运算符优先级似乎会让人望而却步,但是它很快就会变成一件自然而然的事情。