運算子優先序
運算子優先序(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;
a
和 b
的預期結果為 5,因為賦值運算符 (Assignment operator) 為右相依性,因此從右至左返回值。一開始 b
被設定為 5,接著 a
也被設定為 5。
表格(Table)
下方表格列出運算子的相依性,從高 (19) 到低 (1)。
優先性 Precedence | 運算子名稱 Operator type | 相依性 Associativity | 運算子 Individual operators |
---|---|---|---|
19 | Grouping | 無 | ( … ) |
18 | Member Access | 從左至右 | … . … |
Computed Member Access | 從左至右 | … [ … ] | |
new (with argument list) | 無 | new … ( … ) | |
呼叫函式 | 從左至右 | … ( … ) | |
可選串連(Optional chaining) | 從左至右 | ?. | |
17 | new (without argument list) | 從右至左 | new … |
16 | 字尾遞增 | 無 | … ++ |
字尾遞減 | … -- | ||
15 | Logical NOT | 從右至左 | ! … |
Bitwise NOT | ~ … | ||
Unary Plus | + … | ||
Unary Negation | - … | ||
字首遞增 | ++ … | ||
字首遞減 | -- … | ||
typeof | typeof … | ||
void | void … | ||
delete | delete … | ||
await | await … | ||
14 | Exponentiation | 從右至左 | … ** … |
13 | Multiplication | 從左至右 | … * … |
Division | … / … | ||
Remainder | … % … | ||
12 | Addition | 從左至右 | … + … |
Subtraction | … - … | ||
11 | Bitwise Left Shift | 從左至右 | … << … |
Bitwise Right Shift | … >> … | ||
Bitwise Unsigned Right Shift | … >>> … | ||
10 | Less Than | 從左至右 | … < … |
Less Than Or Equal | … <= … | ||
Greater Than | … > … | ||
Greater Than Or Equal | … >= … | ||
in | … in … | ||
instanceof | … instanceof … | ||
9 | Equality | 從左至右 | … == … |
Inequality | … != … | ||
Strict Equality | … === … | ||
Strict Inequality | … !== … | ||
8 | Bitwise AND | 從左至右 | … & … |
7 | Bitwise XOR | 從左至右 | … ^ … |
6 | Bitwise OR | 從左至右 | … | … |
5 | Logical AND | 從左至右 | … && … |
4 | Logical OR | 從左至右 | … || … |
Nullish Coalescing | 從左至右 | … ?? … | |
3 | 條件運算 | 從右至左 | … ? … : … |
2 | 賦值 | 從右至左 | … = … |
… += … | |||
… -= … | |||
… **= … | |||
… *= … | |||
… /= … | |||
… %= … | |||
… <<= … | |||
… >>= … | |||
… >>>= … | |||
… &= … | |||
… ^= … | |||
… |= … | |||
… &&= … | |||
… ||= … | |||
… ??= … | |||
1 | Comma / Sequence | 從左至右 | … , … |