運算子優先序

運算子優先序(Operator precedence)決定了運算子彼此之間被語法解析的方式,優先序較高的運算子會成為優先序較低運算子的運算元(operands)。

嘗試一下

console.log(3 + 4 * 5); // 3 + 20 // Expected output: 23 console.log(4 * 3 ** 2); // 4 * 9 // Expected output: 36 let a; let b; console.log((a = b = 5)); // Expected output: 5 

相依性(Associativity)

當優先序相同時,使用相依性決定運算方向。範例如下:

a OP b OP c 

左相依性 (Left-associativity) ,表示處理順序為從左至右 (a OP b) OP c,反之,右相依性(right-associativity) 表示處理順序為從右至左 a OP (b OP c)。賦值運算符 (Assignment operators) 為右相依性,範例如下:

js
a = b = 5; 

ab 的預期結果為 5,因為賦值運算符 (Assignment operator) 為右相依性,因此從右至左返回值。一開始 b 被設定為 5,接著 a 也被設定為 5。

表格(Table)

下方表格列出運算子的相依性,從高 (19) 到低 (1)。

優先性
Precedence
運算子名稱
Operator type
相依性
Associativity
運算子
Individual operators
19Grouping( … )
18Member Access從左至右… . …
Computed Member Access從左至右… [ … ]
new (with argument list)new … ( … )
呼叫函式從左至右… ( )
可選串連(Optional chaining)從左至右?.
17new (without argument list) 從右至左new …
16字尾遞增… ++
字尾遞減… --
15Logical NOT從右至左! …
Bitwise NOT~ …
Unary Plus+ …
Unary Negation- …
字首遞增++ …
字首遞減-- …
typeoftypeof …
voidvoid …
deletedelete …
awaitawait …
14Exponentiation從右至左… ** …
13Multiplication從左至右… * …
Division… / …
Remainder… % …
12Addition從左至右… + …
Subtraction… - …
11Bitwise Left Shift從左至右… << …
Bitwise Right Shift… >> …
Bitwise Unsigned Right Shift… >>> …
10Less Than從左至右… < …
Less Than Or Equal… <= …
Greater Than… > …
Greater Than Or Equal… >= …
in… in …
instanceof… instanceof …
9Equality從左至右… == …
Inequality… != …
Strict Equality… === …
Strict Inequality… !== …
8Bitwise AND從左至右… & …
7Bitwise XOR從左至右… ^ …
6Bitwise OR從左至右… | …
5Logical AND從左至右… && …
4Logical OR從左至右… || …
Nullish Coalescing從左至右… ?? …
3條件運算從右至左… ? … : …
2賦值從右至左… = …
… += …
… -= …
… **= …
… *= …
… /= …
… %= …
… <<= …
… >>= …
… >>>= …
… &= …
… ^= …
… |= …
… &&= …
… ||= …
… ??= …
1Comma / Sequence從左至右… , …