1.演算子の概要
演算子は、算術演算子に代表されるように、変数やリテラルなどの値に対して演算を行うための記号です。 演算子の中でも有名なのが、加算演算子や減算演算子などの算術演算子です。
JavaScriptの組み込み演算子は、『オペランド』の個数によって単数演算子、二項演算子、三項演算子に分類することができます。また、間値演算子か前置演算子か、数値、文字列、ファイルなど捜査対象によっても分類できます。ただし、これらの分類はプログラミングする上であまり重要ではなく、一つ一つの演算子を理解することが必要となります。
用語
- オペランド
- 演算の対象となる値。演算内容をあらわす記号は演算子と呼びます。例えば 10+X という式では、10 と X がオペランドで、+ がオペレータです。
演算子の優先順位
演算子には結合性と優先順位があります。次の表は優先順位が高い順になっています。
演算子の一覧
| 演算子 | 結合性 |
|---|---|
| 配列 括弧 | 左 |
| インクリメント(++) デクリメント( -- ) 反転( ~ ) NOT( ! ) |
しない |
| 乗算( * ) 除算( / ) 剰余( % ) |
左 |
| 加算( + ) 減算( - ) 文字列結合( + ) |
左 |
| 左ビットシフト( << ) 右ビットシフト( >> ) 符号なし右ビットシフト( >>> ) |
左 |
| 小さい( < ) 大きい( > ) 小さいか等しい( <= ) 大きいか等しい。( >= ) |
しない |
| 等しい( == ) 等しくない( != ) 等しい( === ) 等しくない( !== ) |
しない |
| ビットごとのAND( & ) ビットごとのXOR( ^ ) ビットごとのOR( | ) |
左 |
| 論理AND( && ) | 左 |
| 論理OR( || ) | 左 |
| 3項の条件演算子( ?: ) | 右 |
| 代入演算子( = += -= *= など ) | 右 |
| カンマ( , ) | 左 |
結合性
結合性とは、左右どちらかに配置された変数や定数を演算の対象にするかということです。たとえば、&& や || などの論理演算子は左側にある値を対象とします。代入演算子などは右側にある値を対象とします。たとえば、次の式は、加算演算子が左側にある値に対して、右側の値を加算し、代入演算子が右側にある値を左側にある変数に代入しています。
# 10 に x を加算する val = 10 + x;
演算子と優先順位
優先順位は利便性を考慮して付けられているので、あまり気にしなくても正常に扱えます。もし不安な時は、カッコをつかって順番をはっきりさせましょう。
x = (10 + 10) * 2;
演算子の中で、項が最も高い優先順位を持っています。項には、変数、クォート、クォート風の演算子、カッコで囲んだ式、引数をカッコで囲んだ関数が含まれます。
単項演算子は、引数として1個の値を受け取るものです。演算子を挟んで右と左に値が必要な二項演算子、右側、もしくは左側だけが必要な単項演算子です。
2.算術演算子
算術演算子は、数値に対して数学関数を実行します。
算術演算子の使用方法
算術演算子の一覧
| 演算子 | 説明 | 例題 |
|---|---|---|
| + | 加算 | $x = 10+2 # $x の値は 12 |
| - | 減算 | $x = 10-2 # $x の値は 8 |
| * | 乗算(×) | $x = 10*2 # $x の値は 20 |
| / | 除算(÷) | $x = 10/2 # $x の値は 5 |
| % | 剰余 | $x = 10%2 # $x の値は 0 |
| ** | 累乗 | $x = 10** # $x の値は 100 |
| ++ | インクリメント | $x = 10++ # $x の値は 11 |
| -- | デクリメント | $x = 10-- # $x の値は 9 |
プログラム言語のほとんどは、算術式を左から順に記述します。2分の1 という式をプログラミング言語のルールに従うと、1/2 となります。
カッコの使い方は代数学の場合と同じです。たとえば、 b+c に a を掛けるには次のようにします。
(b + c) * a
演算子の順番では、乗算、除算、剰余演算子の次に加算、減算が計算されます。同一の優先順位にある演算子が複数並ぶときは、左から順に計算されます。ただし、カッコ内にある演算子は、最初に計算されます。計算式が複雑になるときはカッコを使って見やすくしましょう。
単項のマイナス( - )
単項演算子のマイナス( - )は対象の値が数値であれば、算術否定を行ないます。
x = -10; val = -x; // xの値が数値なので、算術否定が行われ、valの値は 10
足し算/引き算/掛け算/割り算
足し算、引き算、掛け算、割り算は違和感なく使うことができると思います。
x = 10 + 2; # x の値は 12x = 10 - 2; # x の値は 8 x = 10 * 2; # x の値は 20 x = 10 / 2; # x の値は 5
※ 割る数が 0 だとオーバーフローが発生します。割る数が変数ならチェックしてから割り算を実行してください。
剰余
剰余は割ったあまりを返します。
x = 10 % 4; // 割り切れなかった2が返され、x の値は 2 x = 10 % 2; // 2 * 5で割り切れるから x の値は 00
インクリメント/デクリメント
++ 演算子と -- 演算子は、引数に1を加える、もしくは1を引きます。
x = 5; y = 5; x++; // x は加算されて6 y--; // y は減算されて4
これらの演算子は、引数の前にある場合は値を返す前に値を増減し、引数の後ろにある場合は値を返してから増減します。引数の前に置く場合はプリインクリメント/プリデクリメント、引数の後に置く場合はポストインクリメント/ポストデクリメントといいます。
x = 5; y = 5 z = x++; // z に x の値を代入してから、x の値を増加(z の値は 5)) z = ++y; // yを増加させてからその値を代入(z の値は 6))
3.比較演算子
予測できない複数の値を比較したいときは、『比較演算子』を使います。比較演算子は数値用と文字列用の2種類が用意されています。
比較演算子の使用方法
比較演算子は左引数と右引数を比較し、その結果を論理値で返します。
数値比較演算子と文字列比較演算子の早見表
| 比較 | 数値 | 戻り値 |
|---|---|---|
| 等しい | == | 左引数と右引数が等しければ真を返す。 |
| 等しくない | != | 左引数と右引数が等しくなければ真を返す。 |
| 等しい | === | == 演算子と同様に比較を行いますが、比較対象が同じデータ型でないと評価しません。 |
| 等しくない | !== | != 演算子と同様に比較を行いますが、比較対象が同じデータ型でないと評価しません。 |
| 小さい | < | 左引数が右引数より小さければ真を返す。 |
| 大きい | > | 左引数が右引数より大きければ真を返す。 |
| 以下 | <= | 左引数が右引数と同じか小さければ真を返す。 |
| 以上 | >= | 左引数が右引数と同じか大きければ真を返す。 |
| 比較 | <=> | 等しければ0、大きければ1、右引数が大きければ-1を返す。 |
数値用の演算子でも、文字列を比較することができます。
1 == '1'; # 等しい 'alpha' == 'beta' # 等しくない
数値や文字も真偽値が必要なところでは真偽を解釈されます。
# 0 は偽りなのでブロックを実行しない
if (0) { ... }
# 1 は真なのでブロックを実行
if (1) { ... }
# 空の文字列は偽なのでブロックを実行しない
if ("") { ... }
# 通常の文字列なら真なのでブロックを実行する
if ("a") { ... }
4.論理演算子
&& や || は『論理演算子』と呼ばれています。「AとBがTRUEならば・・・」、「A、もしくはBのどちらかがTRUEならば・・・」など、式の真偽値を左から順に解釈していきます。
論理演算子の使用方法
論理演算子の一覧1
| 名前 | 例 | 結果 |
|---|---|---|
| 論理積 | a && b | $a と $b が真ならTRUEを返す |
| 論理和 | a || b | $a もしくは $b が真ならTRUEを返す |
| 否定 | ! a | $aが真でなければTRUEを返す |
用語
- 論理積
- && は、左側の演算子が真であれば、右側の演算子も評価します。左側の演算子が偽であれば、右側の演算子を評価せずに結果を返します。
- 論理和
- || は、左側の演算子が真であれば、右側の演算子を評価せずに結果を返します。左側の演算子が偽りであれば、右側の演算子も評価します。
条件演算子
?: は、『条件演算子』です。? の前の引数が TRUE であれば、: の前の引数が返されますが、FALSE であれば、: の後の引数が返されます。
x = a > b ? a : 0;
上記の例は、a が b より大きい値であれば a の値を返し、それ以外は 0 を返します。
5.文字列演算子
文字列演算子は、値を文字列リテラルと解釈して演算処理を行います。
文字列を連結する演算子
+ 演算子は文字列の連結を行います。
x = "filename"; x = x + ".txt"; // x の値は "filename.txt"
6.ビット演算子
ビット演算子は、ビットを対象として処理する演算子です。
論理積
& は、両被演算子のビットごとに論理積をとって、その結果を返します。
X = x1 & x2;
論理和
| は、両被演算子のビットごとに論理和をとって、その結果を返します。
X = x1 | x2;
排他的論理和
^ は、両被演算子のビットごとに排他論理和をとって、その結果を返します。
X = x1 ^ x2;
~ 演算子
式で指定された値の各ビットを反転させます。元の式でビットが 1 の場合、必ず 0 になります。元の式でビットが 0 の場合、必ず 1 になります。
X = ~ x1
~ 演算子は、式の値を 2 進数形式で取り込み、その各ビットを反転させます。例えば変数x1の値が0101であれば、変数Xは1010になります。
シフト演算子
<<
演算子は、左引数の値を右引数で示すビット数だけ、左にシフトした値を返します。引数は整数でなければなりません。
>>
演算子は、左引数の値を右引数で示すビット数だけ、右にシフトした値を返します。引数は整数でなければなりません。
X = x1 >> x2;
X = x1 << x2;
>>>演算子
値の各ビットを指定されたビット数分だけ右へシフトします。ただし、符号は保持されません。
X = x1 >>> x2
>>> 演算子は、x1 の各ビットを x2 で指定されたビット数分だけ右へシフトします。上位ビットは、0 で埋められます。シフトされて最下位ビットより右へ移動した桁は破棄されます。
X = -14 >>> 2
変数 X の値は、-14 (2 進数で 11111111 11111111 11111111 11110010) から 2 ビット分だけ右シフトされて
1073741820 (2 進数で 00111111 11111111 11111111 11111100) になります。
7.代入演算子
= は代入演算子で、算術演算子、論理演算子、文字列演算子、繰り返し演算子、ビット演算子などと組み合わせて使うことができます。
代入演算子の使用方法
最もよく使われる代入演算子は、次のような単純代入です。
// x に 10 を代入 x = 10; // x に x の値掛ける2の値を代入 x = x * 2;
上記の最後の行のように、左辺値の値を元にした計算は1つの行で済ませることができます。たとえば、以下の2つの式は同じ意味になります。
// x に 2 を加算 x = x + 2; // 上記の式と同様に、x に 2 を加算 x += 2;
代入演算子の一覧
| 演算子 | 説明 |
|---|---|
| += | 加算して代入
x = 10; |
| *= | 乗算して代入
x = 10; |
| -= | 減算して代入
x = 10; |
| /= | 除算して代入
x = 10; |
| %= | 剰余して代入x = 10; |