JavaScript重难点实例精讲
上QQ阅读APP看书,第一时间看更新

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