
1.4.4 运算符优先级
在JavaScript中存在一系列的运算符,每个运算符都有各自的优先级,优先级决定了表达式在执行时的先后顺序,其中优先级最高的最先执行,优先级最低的最后执行。
我们以下面一个表达式为例。
a OP1 b OP2 c
当我们使用不同的OP运算符时,语句的执行顺序是不一样,以下面两个语句为例。
// 语句1 a = b = c; // a = b = 10; // 语句2 a > b > c; // 6 > 4 > 3
在语句1中,将运算符OP1与OP2同时设置为赋值运算符,因为优先级相同,所以会从右到左依次运行,结果等同于下面的情况。
b = 10; a = 10;
在语句2中,将运算符OP1与OP2同时设置为比较运算符,因为优先级相同,所以从左至右依次执行,结果等同于下面的情况。
6 > 4; // true true > 3 // false
最终会返回“false”。
下面总结了在JavaScript中存在的运算符,并将它们的优先级从高至低排列,如表1-1所示,方便大家查询。
表1-1

续表

续表

通过表1-1我们可以发现,在JavaScript中一共存在20种优先级的运算符,其中包含一些符号相同但是优先级不同的运算符,例如前置递增运算符和后置递增运算符。
另外,在一个语句中如果存在多个运算符时,需要我们熟练掌握各个运算符的优先级,才能得到正确的运算结果。
var arr = []; var y = arr.length <= 0 || arr[0] === undefined ? x : arr[0];
上面的语句中存在小于等于(<=),逻辑或(||),全等号(===),条件运算符(? :)这4种运算符。
根据运算符优先级表格,我们知道运算符执行顺序为:小于等于(<=)、全等号(===)、逻辑或(||)、条件运算符(? :)。
因此实际执行的顺序如下。
var y = ((arr.length <= 0) || (arr[0] === undefined)) ? x : arr[0];
需要特别关注的是,小括号可以用来提高优先级,因为小括号在所有运算符的优先级中是最高的,所以在小括号中的表达式是最先执行的。
(3 + 4) * 5;
上面的语句因为小括号的存在,会优先执行3 + 4 = 7,然后执行乘法7 × 5 = 35。
运算符因为多样性的存在而导致优先级判断很复杂,因此建议使用小括号,以保证运算顺序清晰可读,这对代码的维护和除错至关重要。
但是,小括号并不是运算符,所以不具有求值作用,它只改变运算的优先级。
下面代码的第二行,如果小括号具有求值作用,那么就会变成1 = 2,是会抛出异常的。但是,下面的代码可以运行,这验证了小括号只会改变优先级,不会求值。
var x = 1; (x) = 2;
这也意味着,如果整个表达式都放在小括号之中,那么不会有任何效果。
(exprssion) // 等同于 expression
函数放在小括号中,会返回函数本身。如果小括号紧跟在函数的后面,就表示调用函数。
function f() { return 1; } (f); // function f(){return 1;} f(); // 1
小括号之中只能放置表达式,如果将语句放在小括号之中,就会报错。
(var a = 1); // SyntaxError: Unexpected token var