在线文档教程

Operator Precedence

Operator Precedence

运算符的优先级决定了表达式中运算执行的先后顺序,优先级高的运算符最先被执行。

下面是一个简单的例子:

3 + 4 * 5 // returns 23

乘法运算符 ("*")比起加法运算符("+")有着更高的优先级,所以它会被最先执行。

结合性

结合性决定了拥有相同优先级的运算符的执行顺序。考虑下面这个表达式:

a OP b OP c

左结合(从左到右计算)相当于把左边的子表达式加上小括号(a OP b) OP c,类似的,右关联(从右到左计算)相当于a OP (b OP c)。赋值运算符是右关联的,所以你可以这么写:

a = b = 5;

结果 a和 b 的值都会成为5。这是因为赋值运算符的返回结果就是赋值运算符右边的那个值,具体过程是:b被赋值为5,然后a也被赋值为 b=5 的返回值,也就是5。

汇总表

下面的表将所有运算符按照优先级的不同从高到低排列。

PrecedenceOperator typeAssociativityIndividual operators
20Groupingn/a( … )
19Member Accessleft-to-right… . …
Computed Member Accessleft-to-right… …
new (with argument list)n/anew … ( … )
Function Callleft-to-right… ( … )
18new (without argument list)right-to-leftnew …
17Postfix Incrementn/a… ++
Postfix Decrementn/a… --
16Logical NOTright-to-left! …
Bitwise NOTright-to-left~ …
Unary Plusright-to-left
Unary Negationright-to-left
Prefix Incrementright-to-left++ …
Prefix Decrementright-to-left-- …
typeofright-to-lefttypeof …
voidright-to-leftvoid …
deleteright-to-leftdelete …
15Exponentiationright-to-left… ** …
14Multiplicationleft-to-right… * …
Divisionleft-to-right… / …
Remainderleft-to-right… % …
13Additionleft-to-right… + …
Subtractionleft-to-right… - …
12Bitwise Left Shiftleft-to-right… << …
Bitwise Right Shiftleft-to-right… >> …
Bitwise Unsigned Right Shiftleft-to-right… >>> …
11Less Thanleft-to-right… < …
Less Than Or Equalleft-to-right… <= …
Greater Thanleft-to-right… > …
Greater Than Or Equalleft-to-right… >= …
inleft-to-right… in …
instanceofleft-to-right… instanceof …
10Equalityleft-to-right… == …
Inequalityleft-to-right… != …
Strict Equalityleft-to-right… === …
Strict Inequalityleft-to-right… !== …
9Bitwise ANDleft-to-right… & …
8Bitwise XORleft-to-right… ^ …
7Bitwise ORleft-to-right… | …
6Logical ANDleft-to-right… && …
5Logical ORleft-to-right… || …
4Conditionalright-to-left… ? … : …
3Assignmentright-to-left… = …

| … += … |

| … -= … |

| … **= … |

| … *= … |

| … /= … |

| … %= … |

| … <<= … |

| … >>= … |

| … >>>= … |

| … &= … |

| … ^= … |

| … |= … |

| 2 | yield | right-to-left | yield … |

| yield* | right-to-left | yield* … |

| 1 | Spread | n/a | ... … |

| 0 | Comma / Sequence | left-to-right | … , … |