演算子

この記事では、JavaScriptの演算子について解説する。

プログラミングは、様々な演算子を用いて処理を行う。

この記事で学ぶこと:

  • 演算子の使い方
  • 演算子の優先順位

オペランドについて

オペランドとは数式を構成する要素のうち、演算の対象となる値や変数などのこと。

JavaScriptでは演算子(+*など)とオペランド(値や変数)を組み合わせて計算を行う。


let a = 1;
let b = 2;
console.log(a + b);     // 3

この例では、

  • + が演算子
  • ab がオペランド

となっている。

演算子は「なにをするか表す記号」、オペランドは「なにに対して行うか」を表している。

演算子の種類

インクリメントとデクリメント

JavaScriptにはインクリメントとデクリメントがある。

インクリメントとデクリメント
演算子 名称 説明
A++ 後置型インクリメント演算子 変数の値を1加算し、演算前の結果を返す
A-- 後置型デクリメント演算子 変数の値を1減算し、演算前の結果を返す
++A 前置型インクリメント演算子 変数の値を1加算し、演算後の結果を返す
--A 前置型デクリメント演算子 変数の値を1減算し、演算後の結果を返す

インクリメントとデクリメントの使い方

以下にインクリメントとデクリメントの使用例を示す。


let num1 = 1;
let num2 = 1;
let num3 = 1;
let num4 = 1;

console.log(num1++);   // 1
console.log(++num2);   // 2
console.log(num3--);   // 1
console.log(--num4);   // 0

単項演算子

単項演算子は一つのオペランドによる演算子である。

主な演算子は以下の通りである。

単項演算子一覧
演算子 名称 説明
+ 単項プラス演算子 オペランドを評価し、数値以外の場合は数値に変換する
- 単項マイナス演算子 オペランドの符号を反転する
~ ビット否定演算子 2進数表記でオペランドに対応するビットが 0 のビット位置を 1 にそれ以外のビット位置に 0 を設定して返す
! 論理否定演算子 論理型の演算子を反転する
true(真)ならfalse(偽)になりその逆も同様になる
論理型以外に使った場合 true に変換できるオペランドは false 、それ以外は true を返す

単項演算子の使い方

以下に単項演算子の使用例を示す。


const a = 1;
const b = -1;
const c = "1";

// 単項プラス演算子の例
console.log(+a);       // 1
console.log(+b);       // -1
console.log(+c);       // 1
console.log(+"");      // 0
console.log(+true);    // 1
console.log(+false);   // 0

// 単項マイナス演算子の例
console.log(-a);       // -1
console.log(-b);       // 1
console.log(-c);       // -1

// ビット否定演算子
const bit1 = 5;        // 00000000000000000000000000000101(2進数表記)
const bit2 = -2;       // 11111111111111111111111111111110(2進数表記)
console.log(~bit1);    // -6 (11111111111111111111111111111010 2進数表記)
console.log(~bit2);    // 1 (00000000000000000000000000000001 2進数表記)

// 論理否定演算子の例
console.log(!true);    // false
console.log(!false);   // true
console.log(!"");      // true
console.log(!"Sample");// false

算術演算子

JavaScriptでは、四則演算(足し算、引き算、掛け算、割り算)を行うことができる。

主な演算子は以下の通りである。

算術演算子一覧
演算子 名称 説明
+ 加算演算子 右辺と左辺を足す
- 減算演算子 右辺を左辺から引く
* 乗算演算子 右辺と左辺を掛ける
/ 除算演算子 左辺を右辺で割る
% 剰余演算子 左辺を右辺で割った余りを求める
** べき乗演算子 左辺の数値を右辺の数値だけべき乗する

算術演算子の使い方

以下に算術演算子の使用例を示す。


let a = 10;
let b = 3;
console.log(a + b);   // 13
console.log(a - b);   // 7
console.log(a * b);   // 30
console.log(a / b);   // 3.3333...
console.log(a % b);   // 1
console.log(a ** b);  // 1000

比較演算子

比較演算子は変数や値を比較するために使用する。

比較結果が正しい(真)場合true、間違っている(偽)場合falseになる。

※trueとfalseについては「データ型」の記事で解説する。

比較演算子一覧
演算子 名称 説明
== 等価 オペランドが等しい場合 true になる
!= 不等価 オペランドが等しくない場合に true になる
=== 厳密等価 オペランドが等しく、かつ同じ型である場合 true になる
!== 厳密不等価 オペランドが等しくないか、型が異なる場合 true になる
> 大なり 左のオペランドが右のオペランドよりも大きい場合 true になる
>= 以上 左のオペランドが右のオペランド以上の場合に true になる
< 小なり 左のオペランドが右のオペランドよりも小さい場合に true になる
<= 以下 左のオペランドが右のオペランド以下の場合に true になる

※型の詳しい説明は「データ型」の記事で解説する。

比較演算子の使い方

以下に比較演算子の使用例を示す。

== と === の違い(重要):

  • == (等価):数値と文字列を比較するとき、自動的に調整して比較する。
  • === (厳密等価):数値と文字列などの種類が違う場合、調整せずそのまま比較する。

console.log(5 == "5");      // true ("5"を数値として扱って比較)
console.log(5 === "5");     // false (数値と文字列は違うものとして扱う)

一般的には、より厳密に比較できる=== (厳密等価) を使うことが推奨される。

※数値と文字列の違いは「データ型」の記事で解説する。


console.log(5 === 5);   // true (5と5は等しい)
console.log(5 === "5"); // false (数値と文字列なので型が異なる)
console.log(5 == "5");  // true ("5"を数値として扱うので値が等しい)
console.log(7 !== 7);   // false (7と7は等しい)
console.log(7 !== "7")  // true (数値と文字列なので型が異なる)
console.log(7 != "7")   // false ("7"を数値として扱うので値が等しい)
console.log(5 > 3);     // true (5は3より大きい)
console.log(2 > 10);    // false (2は10より大きくない)
console.log(10 >= 10);  // true (10は10以上)
console.log(3 < 5);     // true (3は5より小さい)
console.log(10 <= 10);  // true (10は10以下)

ビットシフト演算子

ビットシフト演算子は、オペランドのすべてのビットをシフト演算する。

主な演算子は以下の通りである。

ビットシフト演算子
演算子 名称 説明
<< 左シフト演算子 1つ目のオペランドを指定されたビット数だけ左にずらして、数値または長整数を返す
左にずらしてあふれたビットは破棄されて、右から0のビットが入る
>> 右シフト演算子 1つ目のオペランドを指定したビット数だけ右にずらして、数値または長整数を返す
右にずらしてあふれたビットは破棄されて、最も左のビットをコピーして入る
この演算は「符号伝播右シフト」または「算術右シフト」と呼ばれる
>>> 符号なし右シフト演算子 1つ目のオペランドを指定したビット数だけ右にずらして、数値または長整数を返す
右にずらしてあふれたビットは破棄されて、0のビットが左からずれて入る
この演算は「ゼロ埋め右シフト」と呼ばれる

const a = 5;          // 00000000000000000000000000000101 (2進数表記)
const b = 2;          // 00000000000000000000000000000010 (2進数表記)
const c = -3;         // 11111111111111111111111111111101 (2進数表記)

// 左シフト演算子
console.log(a << 2);  // 20 (00000000000000000000000000010100 2進数表記)
console.log(a << b);  // 20 (00000000000000000000000000010100 2進数表記)
console.log(b << 3);  // 16 (00000000000000000000000000010000 2進数表記)
console.log(c << 3);  // -24(11111111111111111111111111101000 2進数表記)

// 右シフト演算子
console.log(a >> 2);  //  1 (00000000000000000000000000000001 2進数表記)
console.log(a >> b);  //  1 (00000000000000000000000000000001 2進数表記)
console.log(b >> 3);  //  0 (00000000000000000000000000000000 2進数表記)
console.log(c >> 3);  // -1 (11111111111111111111111111111111 2進数表記)

// 符号なし右シフト演算子
console.log(a >> 2);  //  1 (00000000000000000000000000000001 2進数表記)
console.log(a >> b);  //  1 (00000000000000000000000000000001 2進数表記)
console.log(b >> 3);  //  0 (00000000000000000000000000000000 2進数表記)
console.log(c >> 3);  // 536870911 (00011111111111111111111111111111 2進数表記)

バイナリービット演算子

バイナリービット演算子は、オペランドを32ビット(0と1)の並びとして扱い、数値を返す。

主な演算子は以下の通りである。

バイナリービット演算子一覧
演算子 名称 説明
& ビット論理積(AND)演算子 両方のオペランドの対応するビットがどちらも 1 の位置にビットで 1 を返す
| ビット論理和(OR)演算子 両方のオペランドの対応するビットがどちらかが 1 の位置にビットで 1 を返す
^ ビット排他的(XOR)論理和演算子 両方のオペランドのどちらか一方が 1 の位置にビットで1を返し、それ以外に 0 を返す

バイナリービット演算子の使い方

以下に代入演算子の使用例を示す。


const a = 13;          // 00000000000000000000000000001101 (2進数表記)
const b = 51;          // 00000000000000000000000000110011 (2進数表記)

console.log(a & b);    //  1 (00000000000000000000000000000001 2進数表記)
console.log(a | b);    // 63 (00000000000000000000000000111111 2進数表記)
console.log(a ^ b);    // 62 (00000000000000000000000000111110 2進数表記)

論理演算子

論理演算子は、真(true)と偽(false)の真偽値を操作する。

主な演算子は以下の通りである

論理演算子一覧
演算子 名称 説明
&& 論理積演算子 すべてのオペランドがtrueの場合trueを返し、それ以外の場合falseを返す
|| 論理和演算子 オペランドのどれか1つ以上がtrueの場合trueを返し、それ以外の場合falseを返す
?? ヌル値合体演算子 左辺が null または undefined の場合右辺のオペランドを返し、それ以外の場合は左辺のオペランドを返す

論理演算子の使い方

以下に代入演算子の使用例を示す。


const a = 1;
const b = 0;
const c = 10;
const d = 25;
const e = 50;
const f = null;
const g = undefined;

// 論理積演算子
console.log(true && true);        // true
console.log(true && false);       // false
console.log(false && false);      // false
console.log(a > 0 && a < 10);     // true
console.log(b === 0 && c < 20);   // false
console.log(d <= 10 && e > 50);   // false

// 論理和演算子
console.log(true || true);        // true
console.log(true || false);       // true
console.log(false || false);      // false
console.log(a > 0 || a < 10);     // true
console.log(b === 0 || c < 20);   // true
console.log(d <= 10 || e > 50);   // false

// ヌル値合体演算子
console.log(f ?? a);              // 1
console.log(b ?? c);              // 0
console.log(g ?? d);              // 25
console.log(e ?? f);              // 50

代入演算子

代入演算子は、変数に値を代入するために使用する。

主な演算子は以下の通りである。

代入演算子一覧
演算子 名称 説明
= 代入演算子 右辺のオペランドを左辺のオペランドに代入する
+= 加算代入演算子 2つのオペランドで加算を実行して、左オペランドへ代入する
-= 減算代入演算子 2つのオペランドで減算を実行して、左オペランドへ代入する
*= 乗算代入演算子 2つのオペランドで乗算を実行して、左オペランドへ代入する
/= 除算代入演算子 2つのオペランドで除算を実行して、左オペランドへ代入する
%= 剰余代入演算子 2つのオペランドで剰余を実行して、左オペランドへ代入する
**= べき乗代入演算子 2つのオペランドでべき乗を実行して、左オペランドへ代入する
<<= 左シフト代入演算子 2つのオペランドで左シフトを実行して、左オペランドへ代入する
>>= 右シフト代入演算子 2つのオペランドで右シフトを実行して、左オペランドへ代入する
>>>= 符号なし右シフト代入演算子 2つのオペランドで符号なし右シフトを実行して、左オペランドへ代入する
&= ビット論理積代入演算子 2つのオペランドで論理積を実行して、その結果を左オペランドへ代入する
|= ビット論理和代入演算子 2つのオペランドで論理和を実行して、その結果を左オペランドへ代入する
^= ビット排他的論理和代入演算子 2つのオペランドで排他的論理和を実行して、その結果を左オペランドへ代入する

代入演算子の使い方

以下に代入演算子の使用例を示す。


let a = 10;
a += 5;         // a = a + 5 と同じ
console.log(a); // 15
a -= 3;         // a = a - 3 と同じ
console.log(a); // 12
a *= 2;         // a = a * 2 と同じ
console.log(a); // 24
a /= 4;         // a = a / 4 と同じ
console.log(a); // 6
a %= 4;         // a = a % 4 と同じ
console.log(a); // 2
a **= 3;        // a = a ** 3 と同じ
console.log(a); // 8