演算子の優先順位と結合規則

一つの式の中で複数の演算子が使われている場合、どのような順番で演算を行うのかによって結果が異なる場合があります。その為、 JavaScript では演算子の優先順位が決められており優先順位が高いものから順に演算を行います。また同じ優先順位の演算子が使われていた場合にどの順番で演算を行うのかを決めるために演算子の結合規則も決められています。ここでは JavaScript における演算子の優先順位と結合規則について解説します。

(Last modified: )

演算をどの順番で行うのか

同じ式の中で複数の演算子が使われていた場合、どの演算を最初に行うのかによって結果が異なる場合があるという点についてまず簡単なサンプルで確認をしてみます。

演算子の優先順位

最初に演算子の優先順位が異なる場合です。次のサンプルをみてください。

let num;
num = 5 + 4 * 3;

このサンプルでは + と * の 2 つの演算子が使われています。例えば先に + の演算を行うと次のようになります。

5 + 4 = 9
9 * 3 = 27

今度は逆に * の演算を先に行うと次のようになります。

4 * 3 = 12
5 + 12 = 17

このように先に + の演算を行うのか、それとも * の演算を行うのかによって結果が異なりました。このような場合に演算子の優先順位に従って演算を行う順序が決められます。今回のサンプルの場合であれば * の演算子のほうが + の演算子よりも優先順位が高いために先に * の演算が行われます。

let num;
num = 5 + 4 * 3;

console.log(num);
>> 17

演算子の結合規則

続いて演算子の優先順位が同じだった場合です。次のサンプルをみてください。

let num;
num = 12 / 4 * 3;

このサンプルでは / と * の 2 つの演算子が使われています。例えば先に / の演算を行うと次のようになります。

12 / 4 = 3
3 * 3 = 9

今度は逆に * の演算を先に行うと次のようになります。

4 * 3 = 12
12 / 12 = 1

今回も先に * の演算を行うのか、それとも / の演算を行うのかによって結果が異なりました。ただ今回の場合は * と / の演算子の優先順位は同じです。演算子の優先順位が同じ場合は演算子の結合規則に従って演算を行う順序が決められます。今回のサンプルの場合であれば * の演算子も / の演算子も結合規則は左から右なので、左側に書かれている / の演算が先に行われます。

let num;
num = 12 / 4 * 3;

console.log(num);
>> 9

演算子の優先順位と結合規則の一覧

JavaScript で利用可能な演算子の優先順位と結合規則の一覧は次のようになっています。

優先順位結合規則演算子説明
21--()グループ化
20.プロパティへのアクセス
[]プロパティへのアクセス
--new引数ありの場合
()関数呼び出し
?.
19new引数なしの場合
18--++後置インクリメント
----後置インクリメント
17!論理否定
~ビットNOT
+単項プラス演算子
-単項マイナス演算子
++前置インクリメント
--前置インクリメント
deleteプロパティの削除
typeof型の確認
voidundefinedを返す
await
16**べき乗
15*乗算
/除算
%剰余
14+加算
-減算
13<<左ビットシフト
>>右ビットシフト(符号あり)
>>>右ビットシフト(符号なし)
12>大きい
>=以上
<小さい
<=以下
instanceofprototypeプロパティの確認
inプロパティの確認
11==等しい
!=等しくない
===同一
!==同一ではない
10&ビットAND
9^ビットNOT
8|ビットOR
7&&論理積
6||論理和
5??Null合体演算子
4..?..:..三項演算子
3=代入
ope=※1
2yield
yield*
1,カンマ演算子

※1 ope= は「+=」「-=」「**=」「*=」「/=」「%=」「<<=」「>>=」「>>>=」「&=」「|=」「^=」「&&=」「||=」「??=」のことです。

上に書かれているほど優先順位が高く、下になるほど優先順位は低くなります。

括弧を使った優先順位の変更

式の中で複数の演算子が使われていた場合、演算子の優先順位と結合規則によって演算が行われる順番が決まりますが、グループ化を行う括弧()を使うことで演算子の優先順位に関わらず特定の演算を優先させることができます。

次のサンプルをみてください。

let num;
num = 10 + 5 * 4;

console.log(num);
>> 30

二つの演算子 + と * が使用されています。優先順位は * の方が高いので 5 * 4 の演算が行われたあと、その結果である 20 に対して 10 + 20 の演算が行われます。この場合に、 + の演算のほうを優先的に行いたい場合は括弧を使って次のように記述します。

let num;
num = (10 + 5) * 4;

console.log(num);
>> 60

括弧で囲まれた中の演算は、優先順位に関係なく優先的に行われます。よって 10 + 5 の演算が行われたあと、その結果である 15 に対して 15 * 4 の演算が行われました。

括弧の中に複数の演算子が含まれていた場合には、通常と同じく演算子の優先馴致と結合規則で演算される順序がきまります。次のサンプルをみてください。

let num;
num = (10 + 8 / 2) * 4;

console.log(num);
>> 56

括弧が使われているのでまず先に括弧の中の 10 + 8 / 2 の演算が行われます。括弧の中でも複数の演算子 + と / が使われており、 優先順位は / の方が高いので 8 / 2 の演算が行われ、その結果である 4 に対して 10 + 4 の演算が行われます。最後に括弧内の演算結果である 14 に対して 14 * 4 の演算が行われます。

また括弧の中にさらに括弧を記述することもできます。次のサンプルをみてください。

let num;
num = ((10 + 8) / 2) * 4;

console.log(num);
>> 36

この場合最初に内側の括弧内にある 10 + 8 の演算が行われ、その結果である 18 に対して 18 / 2 の演算が行われます。最後に外側の括弧内の演算結果である 9 に対して 9 * 4 の演算が行われます。

このように式の中の一部分を括弧でくくることで、括弧内の演算を優先的に行わせることができるようになります。

-- --

JavaScript における演算子の優先順位と結合規則について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。