运算符优先级
前面介绍了JavaScript的各种运算符,那么在对一些比较复杂的表达式进行运算时,首先要明确表达式中所有运算符参与运算的先后顺序,我们把这种顺序称作运算符的优先级。接下来通过表1列出JavaScript中运算符的优先级,表中运算符的优先级由上至下递减,表右部的第一个接表左部的最后一个。
表1 运算符优先级
结合方向 | 运算符 | 结合方向 | 运算符 |
---|---|---|---|
无 | () | 左 | == != === !== |
左 | . [] new(有参数,无结合性) | 左 | & |
右 | new(无参数) | 左 | ^ |
无 | ++(后置) --(后置) | 左 | | |
右 | ! ~ -(负数) +(正数) ++(前置) --(前置) typeof void delete | 左 | && |
右 | ** | 左 | || |
左 | * / % | 右 | ?: |
左 | + - | 右 | = += = *= /= %= <<= >>= >>>= &= ^= |= |
左 | << >> >>> | 左 | , |
左 | < <= > >= in instanceof |
表1中,在同一单元格的运算符具有相同的优先级,左结合方向表示同级运算符的执行顺序为从左向右,右结合方向则表示执行顺序为从右向左。
从表1可以看出,圆括号“()”是优先级最高运算符,它可以提高圆括号内部运算符的优先级。且当表达式中有多个圆括号时,最内层圆括号中的表达式优先级最高。具体示例如下。
console.log(8 + 6 * 3); // 输出结果:26
console.log((8 + 6) * 3); // 输出结果:42
在上述示例中,表达式“8 + 6 * 3”按照运算符优先级的顺序,先执行乘法“*”,再执行加法“+”,因此结果为26。而加了圆括号的表达式“(8 + 6) * 3”的执行顺序是先执行圆括号内的加法“+”运算,再执行乘法,因此输出结果为42。
由此可见,为复杂的表达式适当地添加圆括号,可避免复杂的运算符优先级法则,让代码更为清楚,并且可以避免错误的发生。