JavaScriptの演算子の使い方と優先順位を徹底解説

JavaScriptの演算子は、プログラミングにおいて非常に重要な役割を果たします。これらの演算子は、変数や値に対するさまざまな操作を実行するために使用されます。また、演算子には優先順位があり、これを理解することは、複雑な式を正確に評価するために不可欠です。本記事では、JavaScriptにおける演算子の基本的な使い方から、各種演算子の優先順位までを詳しく解説します。この記事を通じて、JavaScriptの演算子についての理解を深め、より効果的なコーディングを目指しましょう。

目次

演算子の基本

JavaScriptにおける演算子とは、プログラム内で値や変数に対して特定の操作を行うための記号やキーワードです。演算子にはいくつかの種類があり、それぞれが異なる用途を持ちます。以下に、主要な演算子の種類を紹介します。

算術演算子

算術演算子は、数値に対して基本的な算術操作(加算、減算、乗算、除算など)を行います。

  • 加算(+):二つの数値を加算します。
  • 減算(-):二つの数値を減算します。
  • 乗算(*):二つの数値を乗算します。
  • 除算(/):二つの数値を除算します。

比較演算子

比較演算子は、二つの値を比較し、その結果を論理値(trueまたはfalse)として返します。

  • 等しい(==):二つの値が等しいかを比較します。
  • 厳密に等しい(===):型も含めて二つの値が等しいかを比較します。
  • 異なる(!=):二つの値が異なるかを比較します。
  • 厳密に異なる(!==):型も含めて二つの値が異なるかを比較します。

論理演算子

論理演算子は、論理値(trueまたはfalse)に対して論理演算を行います。

  • 論理積(&&):両方のオペランドがtrueの場合にtrueを返します。
  • 論理和(||):いずれかのオペランドがtrueの場合にtrueを返します。
  • 論理否定(!):オペランドの論理値を反転します。

代入演算子

代入演算子は、右辺の値を左辺の変数に代入します。

  • 基本代入(=):右辺の値を左辺の変数に代入します。
  • 複合代入(+=、-=、*=、/=):左辺の変数に右辺の値を用いて算術操作を行い、その結果を左辺の変数に代入します。

これらの基本的な演算子を理解することで、JavaScriptでのプログラミングがより効率的かつ効果的になります。次に、各演算子の詳細な使い方について見ていきましょう。

算術演算子の使い方

算術演算子は、数値の計算を行うために使用される基本的な演算子です。JavaScriptには、基本的な算術演算を行うための演算子がいくつか用意されています。以下に、主要な算術演算子とその使い方を具体的な例とともに紹介します。

加算(+)

加算演算子は、二つの数値を加算します。また、文字列の結合にも使用されます。

let a = 5;
let b = 3;
let sum = a + b; // 結果は8

let str1 = "Hello, ";
let str2 = "world!";
let greeting = str1 + str2; // 結果は "Hello, world!"

減算(-)

減算演算子は、二つの数値を減算します。

let x = 10;
let y = 4;
let difference = x - y; // 結果は6

乗算(*)

乗算演算子は、二つの数値を乗算します。

let m = 7;
let n = 6;
let product = m * n; // 結果は42

除算(/)

除算演算子は、二つの数値を除算します。

let p = 20;
let q = 4;
let quotient = p / q; // 結果は5

剰余(%)

剰余演算子は、二つの数値を除算した余りを返します。

let r = 10;
let s = 3;
let remainder = r % s; // 結果は1

累乗(**)

累乗演算子は、基数を指定した指数で累乗した結果を返します。

let base = 2;
let exponent = 3;
let power = base ** exponent; // 結果は8

インクリメント(++)

インクリメント演算子は、変数の値を1増加させます。前置インクリメント(++var)と後置インクリメント(var++)の二種類があります。

let num1 = 5;
num1++; // 結果は6(後置インクリメント)

let num2 = 5;
++num2; // 結果は6(前置インクリメント)

デクリメント(–)

デクリメント演算子は、変数の値を1減少させます。前置デクリメント(–var)と後置デクリメント(var–)の二種類があります。

let num3 = 5;
num3--; // 結果は4(後置デクリメント)

let num4 = 5;
--num4; // 結果は4(前置デクリメント)

これらの算術演算子を使用することで、JavaScriptでの数値の計算が容易に行えます。次に、比較演算子の使い方について見ていきましょう。

比較演算子の使い方

比較演算子は、二つの値を比較し、その結果を論理値(trueまたはfalse)として返します。JavaScriptには、様々な種類の比較演算子があり、これらを理解することで条件分岐やループの制御がより効果的に行えます。以下に主要な比較演算子とその使い方を具体例とともに紹介します。

等しい(==)

等しい演算子は、二つの値が等しいかどうかを比較します。型の違いは無視されます。

let a = 5;
let b = '5';
console.log(a == b); // 結果はtrue(型が異なっても値が等しいため)

厳密に等しい(===)

厳密に等しい演算子は、二つの値が等しいかどうかを比較しますが、型も含めて比較します。

let c = 5;
let d = '5';
console.log(c === d); // 結果はfalse(型が異なるため)

異なる(!=)

異なる演算子は、二つの値が異なるかどうかを比較します。型の違いは無視されます。

let e = 5;
let f = '6';
console.log(e != f); // 結果はtrue(値が異なるため)

厳密に異なる(!==)

厳密に異なる演算子は、二つの値が異なるかどうかを比較しますが、型も含めて比較します。

let g = 5;
let h = '5';
console.log(g !== h); // 結果はtrue(型が異なるため)

大なり(>)

大なり演算子は、左辺の値が右辺の値より大きいかどうかを比較します。

let i = 10;
let j = 5;
console.log(i > j); // 結果はtrue(10は5より大きいため)

小なり(<)

小なり演算子は、左辺の値が右辺の値より小さいかどうかを比較します。

let k = 3;
let l = 7;
console.log(k < l); // 結果はtrue(3は7より小さいため)

大なりイコール(>=)

大なりイコール演算子は、左辺の値が右辺の値以上かどうかを比較します。

let m = 5;
let n = 5;
console.log(m >= n); // 結果はtrue(5は5以上であるため)

小なりイコール(<=)

小なりイコール演算子は、左辺の値が右辺の値以下かどうかを比較します。

let o = 3;
let p = 5;
console.log(o <= p); // 結果はtrue(3は5以下であるため)

これらの比較演算子を使用することで、プログラムの制御構造をより柔軟に構築することができます。次に、論理演算子の使い方について見ていきましょう。

論理演算子の使い方

論理演算子は、論理値(trueまたはfalse)に対して論理演算を行い、複数の条件を組み合わせて制御構造を構築する際に使用されます。JavaScriptには、AND、OR、NOTといった主要な論理演算子が用意されています。以下に、各論理演算子の使い方を具体例とともに紹介します。

論理積(AND, &&)

論理積演算子は、両方のオペランドがtrueの場合にtrueを返します。どちらか一方でもfalseであれば、結果はfalseとなります。

let a = true;
let b = false;
console.log(a && b); // 結果はfalse(片方がfalseのため)

let c = true;
let d = true;
console.log(c && d); // 結果はtrue(両方がtrueのため)

論理和(OR, ||)

論理和演算子は、いずれかのオペランドがtrueの場合にtrueを返します。両方がfalseの場合のみ、結果はfalseとなります。

let e = true;
let f = false;
console.log(e || f); // 結果はtrue(片方がtrueのため)

let g = false;
let h = false;
console.log(g || h); // 結果はfalse(両方がfalseのため)

論理否定(NOT, !)

論理否定演算子は、オペランドの論理値を反転させます。trueであればfalseを、falseであればtrueを返します。

let i = true;
console.log(!i); // 結果はfalse(trueを反転させるため)

let j = false;
console.log(!j); // 結果はtrue(falseを反転させるため)

応用例:複数の条件を組み合わせる

論理演算子を使用すると、複数の条件を組み合わせて複雑な論理判定を行うことができます。

let age = 25;
let hasDrivingLicense = true;

// 年齢が18歳以上で、かつ運転免許を持っている場合
if (age >= 18 && hasDrivingLicense) {
    console.log("運転できます");
} else {
    console.log("運転できません");
}

// 年齢が18歳以上または運転免許を持っている場合
if (age >= 18 || hasDrivingLicense) {
    console.log("一部の条件を満たしています");
} else {
    console.log("条件を満たしていません");
}

論理演算子を駆使することで、複数の条件を効率的に評価し、プログラムの制御構造をより柔軟に設計することが可能です。次に、ビット演算子の使い方について見ていきましょう。

ビット演算子の使い方

ビット演算子は、数値をビット単位で操作するために使用されます。これらの演算子は、低レベルの操作や効率的な計算を行う際に非常に役立ちます。JavaScriptには、ビットAND、ビットOR、ビットXOR、ビットNOTなどの主要なビット演算子が用意されています。以下に、各ビット演算子の使い方を具体例とともに紹介します。

ビットAND(&)

ビットAND演算子は、対応するビットが両方とも1の場合にのみ1を返します。

let a = 5;  // 0101(2進数)
let b = 3;  // 0011(2進数)
let result = a & b; // 結果は1(0001)
console.log(result); // 1

ビットOR(|)

ビットOR演算子は、対応するビットのどちらかが1の場合に1を返します。

let c = 5;  // 0101(2進数)
let d = 3;  // 0011(2進数)
let result = c | d; // 結果は7(0111)
console.log(result); // 7

ビットXOR(^)

ビットXOR演算子は、対応するビットが異なる場合に1を返します。

let e = 5;  // 0101(2進数)
let f = 3;  // 0011(2進数)
let result = e ^ f; // 結果は6(0110)
console.log(result); // 6

ビットNOT(~)

ビットNOT演算子は、ビットを反転させます(1を0に、0を1にします)。

let g = 5;  // 0101(2進数)
let result = ~g; // 結果は-6(反転してから符号反転、11111010 -> 2の補数表現)
console.log(result); // -6

左シフト(<<)

左シフト演算子は、ビットを左に指定された数だけシフトします。空いたビットは0で埋められます。

let h = 5;  // 0101(2進数)
let result = h << 1; // 結果は10(1010)
console.log(result); // 10

右シフト(>>)

右シフト演算子は、ビットを右に指定された数だけシフトします。符号ビットは保持されます。

let i = 5;  // 0101(2進数)
let result = i >> 1; // 結果は2(0010)
console.log(result); // 2

符号なし右シフト(>>>)

符号なし右シフト演算子は、ビットを右に指定された数だけシフトし、符号ビットは保持されません(常に0で埋められます)。

let j = -5;  // 11111111111111111111111111111011(2進数)
let result = j >>> 1; // 結果は2147483645(0111111111111111111111111111101)
console.log(result); // 2147483645

これらのビット演算子を使用することで、数値のビット単位の操作が可能となり、特定の低レベルな計算や効率的なデータ処理が行えます。次に、演算子の優先順位について見ていきましょう。

演算子の優先順位

演算子の優先順位は、複数の演算子が含まれる式を評価する際に、どの演算子が最初に実行されるかを決定します。JavaScriptには多くの演算子があり、それぞれに異なる優先順位があります。これを理解していないと、意図しない結果を招くことがあります。以下に、演算子の優先順位について解説します。

優先順位の概念

優先順位とは、演算子の評価順序を決定するルールです。優先順位が高い演算子ほど、低い演算子よりも先に評価されます。例えば、算術演算子の「」と「+」が同時に含まれる式では、「」が先に評価されます。

let result = 5 + 3 * 2; // 結果は11(3 * 2が先に評価されるため)
console.log(result);

演算子の優先順位の例

以下に、主要な演算子の優先順位を示します。

  1. 括弧(()):最も高い優先順位を持ちます。括弧内の式は、最初に評価されます。
   let result = (5 + 3) * 2; // 結果は16(括弧内が先に評価されるため)
   console.log(result);
  1. アクセス演算子(.)、配列アクセス演算子([]):オブジェクトや配列のプロパティへのアクセスが優先されます。
   let arr = [1, 2, 3];
   console.log(arr[0]); // 結果は1
  1. 単項演算子(!、++、–):単項演算子が次に優先されます。
   let x = 5;
   console.log(!false); // 結果はtrue
   console.log(++x); // 結果は6
  1. 算術演算子(*、/、%):乗算、除算、剰余の演算が加減算より優先されます。
   let result = 10 / 2 * 3; // 結果は15
   console.log(result);
  1. 算術演算子(+、-):加算と減算が次に評価されます。
   let result = 10 - 5 + 3; // 結果は8
   console.log(result);
  1. 比較演算子(<、<=、>、>=):比較演算が算術演算よりも後に評価されます。
   console.log(5 > 3); // 結果はtrue
  1. 等値演算子(==、!=、===、!==):等値比較が次に評価されます。
   console.log(5 === '5'); // 結果はfalse
  1. 論理AND(&&):論理ANDは論理ORよりも優先されます。
   console.log(true && false); // 結果はfalse
  1. 論理OR(||):論理ORが最も低い優先順位を持ちます。
   console.log(true || false); // 結果はtrue

実際の使用例

優先順位を理解することで、複雑な式を正しく評価することができます。以下に、複雑な式の評価例を示します。

let result = 5 + 3 * 2 > 10 || 4 < 2;
console.log(result); // 結果はtrue(3 * 2が先に評価され、次に加算と比較が行われる)

このように、演算子の優先順位を理解することで、意図した通りに式を評価することができます。次に、演算子の優先順位表について見ていきましょう。

演算子の優先順位表

JavaScriptの演算子にはそれぞれ優先順位が設定されており、複数の演算子が混在する式を評価する際にどの演算子が先に評価されるかを決定します。以下に、主要な演算子の優先順位を表形式で示します。この表を参考にすることで、複雑な式の評価順序を理解しやすくなります。

優先順位演算子説明
1()括弧
2[], .配列アクセス、プロパティアクセス
3++, --, !, ~単項演算子、論理NOT、ビットNOT
4*, /, %乗算、除算、剰余
5+, -加算、減算
6<<, >>, >>>ビットシフト
7<, <=, >, >=比較演算子
8==, !=, ===, !==等値演算子
9&ビットAND
10^ビットXOR
11|ビットOR
12&&論理AND
13||論理OR
14?:三項演算子
15=, +=, -=, *=代入演算子
16,コンマ演算子

優先順位表の活用例

この優先順位表を使用することで、複雑な式の評価順序を予測しやすくなります。例えば、以下の式を評価する際には、この表を参考にしてどの演算子が先に評価されるかを確認します。

let result = 10 + 5 * 2 < 20 && 4 == 4;

この場合の評価順序は次のようになります。

  1. 乗算(*)が最初に評価されます:5 * 210
  2. 加算(+)が次に評価されます:10 + 1020
  3. 比較演算子(<)が評価されます:20 < 20false
  4. 論理AND(&&)が評価されます:false && 4 == 4false
console.log(result); // 結果はfalse

まとめ

演算子の優先順位を理解することで、複雑な式を正確に評価することが可能になります。優先順位表を参考にしながらコードを書くことで、意図しない評価順序によるバグを防ぐことができます。次に、演算子の結合規則について見ていきましょう。

演算子の結合規則

演算子の結合規則は、同じ優先順位を持つ演算子が複数存在する場合に、どの順序で評価されるかを決定します。結合規則には左結合と右結合の2種類があります。左結合は左から右へ評価され、右結合は右から左へ評価されます。以下に、主要な演算子の結合規則とその使い方を解説します。

左結合

左結合の演算子は、左から右へ順番に評価されます。例えば、加算や減算、乗算、除算などの算術演算子は左結合です。

let result = 5 - 2 + 3; // 左から右へ順番に評価
// まず、5 - 2が評価される → 3
// 次に、3 + 3が評価される → 6
console.log(result); // 結果は6

左結合の例

以下に、左結合の主要な演算子と例を示します。

  • 算術演算子:+, -, *, /, %
  • 比較演算子:<, <=, >, >=
  • 等値演算子:==, !=, ===, !==
  • 論理AND:&&
  • 論理OR:||
let a = 10 / 2 * 3; // 左から右へ順番に評価
// まず、10 / 2が評価される → 5
// 次に、5 * 3が評価される → 15
console.log(a); // 結果は15

右結合

右結合の演算子は、右から左へ順番に評価されます。主に代入演算子や三項演算子が右結合です。

let x = y = 10; // 右から左へ順番に評価
// まず、yに10が代入される → y = 10
// 次に、xにyの値が代入される → x = 10
console.log(x); // 結果は10
console.log(y); // 結果は10

右結合の例

以下に、右結合の主要な演算子と例を示します。

  • 代入演算子:=, +=, -=, *=, /=, %=
  • 三項演算子:? :
let b = 10;
let c = 5;
b += c *= 2; // 右から左へ順番に評価
// まず、c *= 2が評価される → c = 10
// 次に、b += cが評価される → b = 20
console.log(b); // 結果は20
console.log(c); // 結果は10

結合規則の応用例

複雑な式を評価する際には、結合規則を理解しておくことが重要です。以下に、結合規則を用いた応用例を示します。

let result = 2 + 3 * 4 / 2 - 1; // 左結合と優先順位を考慮して評価
// まず、3 * 4が評価される(左結合のため左から右へ)→ 12
// 次に、12 / 2が評価される → 6
// 次に、2 + 6が評価される → 8
// 最後に、8 - 1が評価される → 7
console.log(result); // 結果は7

このように、演算子の結合規則を理解することで、複雑な式の評価順序を正確に予測し、正しい結果を得ることができます。次に、具体的なコード例を用いて、演算子の優先順位と結合規則を実践的に学びましょう。

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

具体的なコード例を用いて、演算子の優先順位と結合規則を実践的に学びましょう。これにより、複雑な式を正確に評価する方法を理解できます。

優先順位と結合規則の組み合わせ

以下のコード例では、複数の演算子が含まれる複雑な式を評価します。この際、優先順位と結合規則を考慮することが重要です。

let result = 5 + 3 * 2 ** 2 / 4 - 1;
// 優先順位と結合規則に従って評価されるステップ
// 1. べき乗(**)が最初に評価される → 2 ** 2 = 4
// 2. 乗算(*)が次に評価される → 3 * 4 = 12
// 3. 除算(/)が次に評価される → 12 / 4 = 3
// 4. 加算(+)が次に評価される → 5 + 3 = 8
// 5. 減算(-)が最後に評価される → 8 - 1 = 7
console.log(result); // 結果は7

三項演算子と論理演算子の組み合わせ

三項演算子と論理演算子を組み合わせた例を見てみましょう。

let a = 10;
let b = 5;
let result = (a > b) ? a : b * 2 && b + 1;
// 優先順位と結合規則に従って評価されるステップ
// 1. 比較演算子(>)が最初に評価される → 10 > 5 = true
// 2. 三項演算子(? :)の条件部分がtrueなので、次はtrue部分が評価される → a
console.log(result); // 結果は10

代入演算子の結合規則

代入演算子の結合規則を確認するための例です。

let x = 2;
let y = 3;
let z = 4;
x = y += z *= 2;
// 優先順位と結合規則に従って評価されるステップ
// 1. 乗算(*)が最初に評価される → z *= 2 → z = 8
// 2. 代入演算子(+=)が次に評価される → y += 8 → y = 11
// 3. 代入演算子(=)が最後に評価される → x = 11
console.log(x); // 結果は11
console.log(y); // 結果は11
console.log(z); // 結果は8

論理演算子の優先順位

論理演算子の優先順位を確認するための例です。

let a = true;
let b = false;
let c = true;
let result = a && b || c;
// 優先順位と結合規則に従って評価されるステップ
// 1. 論理AND(&&)が最初に評価される → true && false = false
// 2. 論理OR(||)が次に評価される → false || true = true
console.log(result); // 結果はtrue

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

括弧を使って演算の優先順位を変更する例です。

let a = 5;
let b = 10;
let c = 15;
let result = (a + b) * c;
// 優先順位と結合規則に従って評価されるステップ
// 1. 括弧内の加算(+)が最初に評価される → 5 + 10 = 15
// 2. 乗算(*)が次に評価される → 15 * 15 = 225
console.log(result); // 結果は225

これらの例を通じて、演算子の優先順位と結合規則を実践的に学ぶことができます。次に、応用例として複雑な式の評価について見ていきましょう。

応用例:複雑な式の評価

複雑な式を評価する際には、演算子の優先順位と結合規則を正確に理解することが重要です。ここでは、いくつかの応用例を通じて、複雑な式の評価方法を学びましょう。

複数の演算子を組み合わせた例

以下の例では、算術演算子と比較演算子、論理演算子を組み合わせた式を評価します。

let a = 5;
let b = 10;
let c = 15;
let result = (a + b * c > 50) && (b - a < c);
// 優先順位と結合規則に従って評価されるステップ
// 1. 乗算(*)が最初に評価される → 10 * 15 = 150
// 2. 加算(+)が次に評価される → 5 + 150 = 155
// 3. 比較演算子(>)が次に評価される → 155 > 50 = true
// 4. 減算(-)が次に評価される → 10 - 5 = 5
// 5. 比較演算子(<)が次に評価される → 5 < 15 = true
// 6. 論理AND(&&)が最後に評価される → true && true = true
console.log(result); // 結果はtrue

関数を含む式の評価

関数呼び出しを含む複雑な式の評価例です。

function multiply(x, y) {
    return x * y;
}

function add(x, y) {
    return x + y;
}

let a = 5;
let b = 10;
let result = multiply(add(a, b), a);
// 優先順位と結合規則に従って評価されるステップ
// 1. 関数呼び出し(add)が最初に評価される → add(5, 10) = 15
// 2. 関数呼び出し(multiply)が次に評価される → multiply(15, 5) = 75
console.log(result); // 結果は75

三項演算子を含む複雑な式

三項演算子を使用して条件に基づいた評価を行う例です。

let a = 20;
let b = 15;
let c = 10;
let result = (a > b) ? (b > c ? a + b : b + c) : (a > c ? a - c : b - a);
// 優先順位と結合規則に従って評価されるステップ
// 1. 最初の条件(a > b)が評価される → 20 > 15 = true
// 2. trueの場合の次の条件(b > c)が評価される → 15 > 10 = true
// 3. trueの場合の式(a + b)が評価される → 20 + 15 = 35
console.log(result); // 結果は35

複雑な条件式

複雑な条件式を評価する例です。

let a = 7;
let b = 3;
let c = 5;
let result = (a % b == 1) || (a + b > c) && (c - b < a);
// 優先順位と結合規則に従って評価されるステップ
// 1. 剰余演算子(%)が最初に評価される → 7 % 3 = 1
// 2. 等値演算子(==)が次に評価される → 1 == 1 = true
// 3. 加算(+)が次に評価される → 7 + 3 = 10
// 4. 比較演算子(>)が次に評価される → 10 > 5 = true
// 5. 減算(-)が次に評価される → 5 - 3 = 2
// 6. 比較演算子(<)が次に評価される → 2 < 7 = true
// 7. 論理AND(&&)が次に評価される → true && true = true
// 8. 論理OR(||)が最後に評価される → true || true = true
console.log(result); // 結果はtrue

これらの応用例を通じて、演算子の優先順位と結合規則を実践的に理解することができます。複雑な式の評価方法を習得することで、JavaScriptのプログラムを書く際により正確で効率的なコードを作成できるようになります。次に、本記事のまとめを見ていきましょう。

まとめ

本記事では、JavaScriptの演算子の使い方とその優先順位について詳しく解説しました。基本的な演算子から始まり、算術演算子、比較演算子、論理演算子、ビット演算子の使い方を具体例とともに学びました。また、演算子の優先順位と結合規則についても詳述し、これらが複雑な式の評価にどのように影響するかを理解しました。

演算子の優先順位と結合規則を正確に把握することで、複雑な式の評価を正しく行い、意図した通りの結果を得ることができます。実際のコード例や応用例を通じて、これらの概念を実践的に学ぶことができました。

JavaScriptの演算子に関する知識を深めることで、より効果的かつ効率的にプログラムを作成するスキルを身につけることができます。今後のコーディングに役立ててください。

コメント

コメントする

目次