「右結合 vs 左結合」を可視化した図解
「右結合」と「左結合」は、同じ優先順位の演算子が並んだときに、どちらの方向から評価するかを決めるルールです。
ここを図で理解すると、JavaScript の「式の流れ」が一気にスッキリします。
算子の結合規則(Associativity)
| 種類 | 意味 | 代表的な演算子 |
|---|---|---|
| 🔹 左結合 (Left-to-right) | 左から順に評価する | +, -, *, /, %, <, >, &&, ` |
| 🔸 右結合 (Right-to-left) | 右から順に評価する | =, **, ? :, ++(前置)など |
図で見る:左結合の流れ
例:
a - b - c
JavaScript左結合(left → right):
┌────┐
│ a - b │ - c
└────┘
つまり:
(a - b) - c
JavaScript👉 左から順に計算していきます。
算術演算子(+, -, *, /, %)や比較演算子などはこれです。
図で見る:右結合の流れ
例①(代入演算子):
x = y = z = 5;
JavaScript右結合(right → left):
x = (y = (z = 5))
👉 一番右の z = 5 から評価され、順に左へ伝わります。
結果:すべて x, y, z が 5 になります。
例②(べき乗 **):
2 ** 3 ** 2
JavaScript右結合(right → left):
2 ** (3 ** 2)
👉 (3 ** 2) が先に計算されるため、結果は2 ** 9 = 512
直感的なイメージ図
左結合:値が左から右へ流れる
a → b → c
\__/ ↓
演算 → 次の演算へ
右結合:値が右から左へ伝わる
a ← b ← c
↑
右側を先に評価
まとめ(覚え方)
| タイプ | 結合方向 | 覚え方 |
|---|---|---|
| 左結合 | 左 → 右 | 「通常の計算の流れ」 |
| 右結合 | 右 → 左 | 「代入・条件・べき乗」など特殊なもの |
困ったら括弧 ()!
自分が意図する順番で明示すれば、どんな場合も安全です。
JavaScript 演算子の優先順位一覧表(上ほど優先度が高い)
| 優先順位 | 演算子 | 説明 | 結合方向 |
|---|---|---|---|
| 20 | () | グループ化(括弧内を先に評価) | ― |
| 19 | . [] ?.() | プロパティ・要素アクセス、オプショナルチェーン | 左→右 |
| 18 | new(引数あり) | コンストラクタ呼び出し | ― |
| 17 | ++ --(後置) | 後置インクリメント/デクリメント | ― |
| 16 | ! ~ + - ++ -- typeof void delete await | 単項演算子(前置) | 右→左 |
| 15 | ** | べき乗(右結合!) | 右→左 |
| 14 | * / % | 乗算・除算・剰余 | 左→右 |
| 13 | + - | 加算・減算 | 左→右 |
| 12 | << >> >>> | ビットシフト | 左→右 |
| 11 | < <= > >= in instanceof | 比較 | 左→右 |
| 10 | == != === !== | 等価・厳密等価 | 左→右 |
| 9 | & | ビット AND | 左→右 |
| 8 | ^ | ビット XOR | 左→右 |
| 7 | ` | ` | ビット OR |
| 6 | && | 論理 AND(短絡評価) | 左→右 |
| 5 | ` | ` | |
| 4 | ?? | ヌル合体演算子(null / undefined チェック) | 左→右 |
| 3 | ?: | 条件(三項)演算子 | 右→左 |
| 2 | =, +=, -=, *=, /=, %=, **=, &&=, ` | =, ??=` | |
| 1 | , | カンマ演算子(最後の値を返す) | 左→右 |
優先順位を意識するポイント
*や/は+よりも先に計算される。**(べき乗)は 右結合 →2 ** 3 ** 2は2 ** (3 ** 2)(=512)。- 代入演算子(
=など)や条件演算子(?:)も 右結合。 - 括弧
()が最優先。わからないときは括弧で囲むのが安全。
例で確認
let result = 10 + 2 * 3 ** 2;
// まず 3 ** 2 = 9 → 2 * 9 = 18 → 10 + 18 = 28
let x = 1;
let y = 2;
let z = 3;
let a = x + y * z; // 1 + (2 * 3) = 7
let b = (x + y) * z; // 括弧で順序を変える → (1 + 2) * 3 = 9
JavaScript