第1章 JavaScript導入ガイド

演算子の概要

変数やリテラルなどの値を演算する記号を演算子と呼びます。
演算子の中でもよく知られているのが、四則演算でも用いられる加算演算子( + )や減算演算子( - )などの算術演算子でしょう。

JavaScriptの演算子には、その性質により様々な種類とグループがあります。数値、文字列、ビットといった特定の対象(オペランド)に有効な演算子で分類すると、下記のようなグループに分かれます。

  • 算術演算子
  • 文字列演算子
  • 論理演算子
  • 比較演算子
  • ビット演算子
  • 代入演算子
  • カンマ演算子
  • 関係演算子

オペランドの種類による分類以外にも、必要とするオペランドの個数による分類もあります。
たとえば、演算子のほとんどは加算演算子のように2つのオペランドが必要です。

// 二項演算子
x + y

数は多くありませんが、オペランドが1つだけのものや、3つのオペランドを必要とする演算子もあます。

// 単項演算子
delete obj
// 三項演算子
(x==1) ? 1 : 0

これらオペランドの個数により分類できるグループは下記の3つがあります。

  • 単項演算子
  • 二項演算子
  • 三項演算子
用語
演算子
変数やリテラルなどの値に対して演算を行うための記号です。
オペランド
演算の対象となる値。演算内容をあらわす記号は演算子と呼びます。例えば 10+X という式では、10 と X がオペランドで、+ がオペレータです。

算術演算子

算術演算子は、数値に対して数学関数を実行します。

算術演算子の一覧
演算子 名称 説明
+ 加算
// x の値は 12
x = 10+2
- 減算
// x の値は 8
x = 10-2
* 乗算( × )
// x の値は 20
x = 10*2
/ 除算( ÷ )
// x の値は 5
x = 10/2
% 剰余
// x の値は 0
x = 10%2
** 累乗
// x の値は 100
x = 10**2
++ インクリメント

前置演算子(++x)として使うと、対象の演算子に 1 を加えた後にその値を返します。後置演算子(x++)では、1 を加える前にその値を返します。

n=10;
// x の値は 11
x = ++n;
-- デクリメント

前置演算子( --x )として使うと、対象の演算子に 1 を引いた後にその値を返します。後置演算子(x--)では、1 を引く前にその値を返します。

n=10;
// x の値は 9
x = --n;
用語
前置演算子
オペランドの前に置く演算子です。
後置演算子
オペランドの後に置く演算子です。

- 演算子(単項演算子) -符号の反転

- 演算子(単項演算子)はプラス・マイナスを反転して返します。例えば x の値が -10 の場合、-x は 10 を返します。

x = -10;
// xの値がマイナスなので、x の値は反転して 10
-x;

加算/減算/乗算/除算

加算、減算、乗算、除算演算子は数学の四則演算と記号もほぼ同じです。加算演算子はプラス記号( + )、減算演算子はマイナス記号( - )、乗算演算子はアスタリスク記号( * )、除算演算子はスラッシュ記号( / )です。

10 + 2;	// 加算
10 - 2;	// 減算
10 * 2;	// 乗算
10 / 2;	// 除算

※ 割る数が 0 だとオーバーフローが発生します。割る数が変数ならチェックしてから割り算を実行してください。

% 演算子 -剰余

剰余演算子( % )は割ったあまりを返します。

10 % 4;	// 割り切れず、あまりの 2 が返される
10 % 2;	// 割り切れるから 0 が返される

インクリメント/デクリメント

インクリメント( ++ )演算子は対象に1を加え、デクリメント( -- )演算子は対象から1を引きます。

x = 5; 
// x は加算されて 6、z は加算前の 5 が代入される
z = x++;
// y は減算されて4、zは減算前の 5 が代入される
y = 5;
z = y--;

これらの演算子は、オペランドの位置により処理のタイミングが変わります。
演算子がオペランドの前にある場合は値を返す前に値を増減し、オペランドの後ろにある場合は値を返してから増減します。

x = 5;
// x は加算されて 6、z は加算後の 6 が代入される
z = ++x;
y = 5
// x は減算されて 4、z は減算後の 4 が代入される
z = --y;

文字列演算子

+ 演算子は、左右どちらかのオペランドが文字列の場合、両方の文字列を連結します。

x = "filename";
x = x + ".txt";	// x の値は filename.txt

論理演算子

&& や || は論理演算子と呼ばれています。「AとBがTRUEならば・・・」、「A、もしくはBのどちらかがTRUEならば・・・」など、式の真偽値を左から順に解釈します。

論理演算子の使用方法

論理演算子の一覧1
演算子 名称 説明
&& 論理積 a && b
a と b が真なら true を返します。
|| 論理和 a || b
a もしくは b が真なら true を返します。
! 論理否定 ! a
a が真でなければ true を返します。
用語
論理積
&& 演算子は、演算する2つの値の両方が真であれば真、どちらか一方でも偽があれば偽を返します。
論理和
|| 演算子は、演算する2つの値のどちらか一方でも真があれば真となります。
論理否定
! 演算子は、値を反転させます。

比較演算子

比較演算子は左オペランドと右オペランドを比較し、その結果を true か false の論理値で返します。

比較演算子の一覧
演算子 名称 説明
== 等値(等しい) 左オペランドと右オペランドが等しければ true を返します。
!= 不等値(等しくない) 左オペランドと右オペランドが等しくなければ true を返します。
=== 同値(等しい) == 演算子と同様に比較を行いますが、比較対象が同じデータ型でないと評価しません。
!== 非同値(等しくない) != 演算子と同様に比較を行いますが、比較対象が同じデータ型でないと評価しません。
< 小なり 左オペランドが右オペランドより小さければ true を返します。
> 大なり 左オペランドが右オペランドより大きければ true を返します。
<= 以下 左オペランドが右オペランドと同じか小さければ true を返します。
>= 以上 左オペランドが右オペランドと同じか大きければ true を返します。

数値用の演算子でも、文字列を比較することができます。

1 == "1";	// 等しい
"alpha" == "beta"	// 等しくない

数値や文字も真偽値が必要なところでは真偽を解釈されます。

// 0 は偽りなのでブロックを実行しない
if ( 0 ) { }
// 1 は真なのでブロックを実行
if ( 1 ) { }
// 空の文字列は偽なのでブロックを実行しない
if ( "" ) { }
// 通常の文字列なら真なのでブロックを実行する
if ( "a" ) { }

ビット演算子

ビット演算子は、対象をビットの集合(0/1)として処理します。処理後、10 進数表現の数値に変換して返します。

2進数

10進数は0から9の数字10個を使って数を表現しますが、2進数は数字の0と1の2個の数字を使います。
数字の0と1は2進数でも0と1で表せますが、数字の2は2進数の0と1の1桁では表せられません。そこで、もう1桁増やし、2桁の10(イチゼロ)で2を表します。10進数の10とは違い、2進数の10は1と0の組み合わせです。

// 数字の2を2進数に変換
x = 2;
x.toString(2);

"10"

// 数字の3を2進数に変換
x = 3;
x.toString(2);

"11"

// 数字の4を2進数に変換
x = 4;
x.toString(2);

"100"

ビット論理積演算子( & )

ビット論理積演算子( & )は、左右のオペランドをビットごとに論理積をとって、その結果を返します。

x & y;

論理積(AND演算)は演算する2つの値の両方が真であれば真、どちらか一方でも偽があれば偽となります。
2進数の場合、どちらかの値が1でなければ結果は0になります。

ビット論理和演算子( | )

ビット論理和演算子( | )は、左右のオペランドをビットごとに論理和をとって、その結果を返します。

x | y;

論理和(OR演算)は演算する2つの値のどちらか一方でも真があれば真となります。
2進数の場合、どちらかの値が1であれば結果は1になります。

ビット排他的論理和演算子( ^ )

ビット排他的論理和演算子( ^ )は、左右のオペランドをビットごとに排他論理和をとって、その結果を返します。

x ^ y;

排他的論理和(XOR演算)は演算する2つの値のどちらか一方でも真があれば真となりますが、両方とも真だと偽になります。
2進数の場合、どちらかの値が1であれば結果は1になりますが、両方とも1だと0になります。

~ 演算子 -ビット論理否定

~ 演算子はオペランドの各ビットを反転させます。ビットが1の場合は0 、0の場合は1に反転します。

~ x

論理否定(NOT演算)は値を反転させます。
2進数の場合、値が1であれば結果は0になります。

左シフト演算子( ><< )
右シフト演算子( >> )

左シフト演算子( ><< )は、左オペランドを右オペランドで示すビット数だけ、左にシフトした値を返します。

x << y;

右シフト演算子( >> )は、左オペランドを右オペランドで示すビット数だけ、右にシフトした値を返します。

x >> y;

ゼロ埋め右シフト演算子( >>> )

ゼロ埋め右シフト演算子( >>> )は、オペランドの各ビットを指定されたビット数分だけ右へシフトします。

x >>> y

>>> 演算子は、x の各ビットを y で指定されたビット数分だけ右へシフトします。上位ビットは、0 で埋められます。シフトされて最下位ビットより右へ移動した桁は破棄されます。

条件演算子

?: は、『条件演算子』です。? の前の引数が TRUE であれば、: の前の引数が返されますが、FALSE であれば、: の後の引数が返されます。

x = a > b ? a : 0;

上記の例は、a が b より大きい値であれば a の値を返し、それ以外は 0 を返します。

代入演算子

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

// x に 10 を代入
x = 10;

= 演算子は単純代入演算子と呼ばれ、数学の = とは違い、右辺と左辺が同じという意味ではありません。
そのため、次のような使い方は期待した結果にはなりません。

if ( x = 10 ){}

上記では、x と 10 が同じかどうかの条件式(後の章で解説します)ではなく、x に 10 が代入されます。
そのため、x の値にかかわらず条件式は必ず true が返されます。数学の = と同じように、左オペランドと右オペランドを比較して、等しければ true を返すようにするには、等値演算子の == を使います。

if ( x == 10 ){}

代入演算子は代入と同時に演算処理を行うものもあります。

// x に 2 を加算
x = x + 2;

上記のように自分自身に演算を加えて代入したいケースでは、複合代入演算子を使って書き換えることができます。

// x に 2 を加算
x += 2;
代入演算子の一覧
演算子 名称 説明
+= 加算代入 加算して代入します。
x = 10; 	
x += 2;  // x の値は 12
*= 乗算代入 乗算して代入します。
x = 10;
x *= 2; // x の値は 20
-= 減算代入 減算して代入します。
x = 10;
x -= 2; // x の値は 8
/= 除算代入 除算して代入します。
x = 10;
x /= 2; // x の値は 5
%= 剰余代入 剰余して代入します。
x = 10;
x %= 3; // x の値は 1
**= 累乗代入
x = 10;
x **= 2; // x の値は 100
&= ビット論理積代入
x = 101;
x &= 110; // x の値は 100
|= ビット論理和代入
x = 101;
x |= 110; // x の値は 111
^= ビット排他的論理和代入
x = 101;
x ^= 110; // x の値は 11
<<= 左シフト代入
x = 10;
x <<= 2;	// x の値は 40
>>= 右シフト代入
x = 10;
x >>= 2;	// x の値は 2
x = -10;
x >>= 2;	// x の値は -3
>>>= ゼロ埋め右シフト代入
x = 10;
x >>>= 2;	// x の値は 2
x = -10;
x >>>= 2;	// x の値は 1073741821

カンマ演算子

カンマ演算子( , )は主に複数の式を記述するのに使われます。

a=1, b=1, c=1, ...

for 文(あとの章で解説します)で複数の変数を初期化したり、増減させたりしたいときに使えます。

// 下記では、変数 i と j を初期化し、i はインクリメント、j はデクリメントしています
for (var i = 0, j = 10; i <= 10; i++, j--){}

単項演算子

単項演算はオペランドを1つだけ取ります。インクリメント、デクリメント、論理否定や、+、- も単項演算子として使えます。

i++;
i--;
-i;

二項演算子

オペランド数によるグループ分けの中では最も数の多いグループです。加算、減算、乗算、除算などの算術演算子や、比較演算子、論理積、論理和などが二項演算子です。

// 加算
a + b;
// 大なり
a > b
// 論理積
a && b;

三項(条件)演算子

オペランドを3つ取るので三項(条件)演算子と呼ばれます。? の前のオペランドが TRUE であれば、: の前のオペランドが返されますが、FALSE であれば、: の後のオペランドが返されます。

x = a > b ? a : 0;

上記の例は、a が b より大きい値であれば a の値を返し、それ以外は 0 を返します。

演算子の優先順位

演算子の優先順位とは、数式を計算する順番の規則です。たとえば、数学と同じように乗算、除算は加算、減算より先に行われます。

// b * c が先に処理される
a + b * c

かっこの使い方も数学と同じで、かっこ内の計算が先に行われます。

(b + c) * a

優先順位は利便性を考慮して付けられているので、あまり気にしなくても扱えます。
もし計算式が複雑になって処理順番がわかりにくくなったときは、積極的にかっこを使って順番を明確にしましょう。

次の表は演算子の優先順位が高い順で並べてあります。下段で詳しく説明していますが、演算子毎の結合性も記載しておきます。

演算子 結合性
グループ化( () ) しない
後置インクリメント( ++ )
後置デクリメント( -- )
しない
論理否定( ! )
ビット論理否定( ~ )
単項の +
単項の -
前置インクリメント( ++ )
前置デクリメント( -- )
累乗( ** )
乗算( * )
除算( / )
剰余( % )
加算( + )
減算( - )
左ビットシフト( << )
右ビットシフト( >> )
ゼロ埋め右シフト( >>> )
より小さい( > )
より小さいまたは等しい( >= )
より大きい( < )
より大きいまたは等しい( <= )
等値( == )
不等値( != )
同値( === )
非同値( !== )
ビット論理積( & )
ビット排他的論理和( ^ )
ビット論理和( | )
論理積( && )
論理和( || )
条件( ?: )
代入( = += -= など )
カンマ( , )

結合性

結合性とは、左右どちらかのオペランドを演算の対象にするかということです。たとえば、&& や || などの論理演算子は左のオペランドを対象とします。代入演算子などは右のオペランドを対象とします。たとえば、次の式は、加算演算子が左のオペランドに対して、右のオペランドを加算し、代入演算子が右オペランドを左オペランドの変数に代入しています。

// a に b を加算し、その結果を x に代入
x = a + b;

Comment

コメントを残す

メールアドレスが公開されることはありません。

関連記事

リズムファクトリーはホームページの制作会社です。
ホームページ制作に関するご要望・ご相談はこちらからどうぞ。

株式会社リズムファクトリーでは現在、下記の職種について人材募集を行っております。
求人をクリックすると「求人情報サイトFind Job!」の求人詳細画面が開きますので、こちらからご応募下さい。

提供 : Webな人の求人情報サイト Find Job!