【JS応用|豆知識】プログラミングの落とし穴!演算子の「結合性」を理解してバグを防ごう

導入

JavaScriptなどのプログラミング言語で、複数の演算子が並んだときに「どちらが先に実行されるか」迷ったことはありませんか?例えば、代入演算子や算術演算子が入り混じった式は、思わぬバグを生む原因になります。この「演算子の優先順位」と密接に関係する「結合性(Associativity)」を理解することで、意図した通りのコードを正確に記述できるようになります。

基礎知識

「結合性」とは、同じ優先順位の演算子が並んだときに、どちらの方向から評価されるかを決定するルールです。大きく分けて「左結合(Left-to-right)」と「右結合(Right-to-left)」の2種類があります。

左結合は、左から右へ順に演算が行われるものです(例: 10 – 5 – 2 は (10 – 5) – 2 となる)。
右結合は、右から左へ順に演算が行われるものです(例: 代入演算子 = がこれに該当します)。

このルールを意識しないと、期待した数値と異なる結果が出たり、意図しない代入が行われたりするリスクがあります。

実装/解決策

結合性の違いを最も顕著に感じるのは「代入演算子」です。代入演算子は「右結合」です。そのため、複数の変数に同時に値を代入する際、右側から順に処理が行われます。この挙動を利用すれば、コードを簡潔に保つことができます。一方、算術演算子は「左結合」であることを常に念頭に置き、複雑な式を書くときは「カッコ()」を使って、人間が読みやすいように明示的に順序を指定するのがベストプラクティスです。

サンプルプログラム

以下のコードを実行して、代入演算子の右結合の特性を確認してみましょう。

// 右結合の例:右から順に評価されるため、aとbの両方に10が代入される
let a, b;
a = b = 10; 

console.log(a); // 10
console.log(b); // 10

// 左結合の例:算術演算子は左から順に評価される
// (20 - 5) - 3 = 12 となる
const result = 20 - 5 - 3;
console.log(result); // 12

// 複雑な式では、結合性を暗記するより「カッコ」を使って優先順位を明確にする
// これにより、読み手(将来の自分やチームメンバー)の誤解を防げる
const calculation = (20 - 5)  (3 + 2);
console.log(calculation); // 75

応用・注意点

現場で最も注意すべきは「論理演算子(&& や ||)」との組み合わせです。これらは左結合ですが、短絡評価(ショートサーキット)という性質も持っています。結合性のルールと短絡評価が組み合わさると、意図しない値が代入されたり、関数が実行されなかったりするバグが発生しやすくなります。

「結合性を暗記してコードを短く書く」ことよりも、「カッコを適切に使って、誰が見ても処理順序が明確なコードを書く」ことの方が、保守性の高いプロダクトを作る上では重要です。特に複雑な式を扱う際は、無理に1行で書こうとせず、計算過程を変数に分ける工夫を心がけましょう。

タイトルとURLをコピーしました