JavaScript - 演算子の概要

演算子の概要

JavaScript の演算子は、算術式、比較式、論理式、代入式などで使われます。ほとんどの演算子は += などの記号で表されますが、deleteinstanceof のようにキーワードで表される演算子もあります。

JavaScript における演算子の優先順位は、下表のとおりです。

  • A (associativity) 列は、式の結合性を表します。
  • N 列は、オペランドの数を表します。
  • 型 列は、想定するオペランドの型と、演算子の結果の型を表します。
演算子の優先順位
演算子説明AN
++
--
後置インクリメント
後置デクリメント

1
1
数値→数値
数値→数値
++
--
-
+
~
!
delete
typeof
void
前置インクリメント
前置デクリメント
数値の符号反転
数値に変換
ビット単位補数
論理補数
プロパティの削除
オペランドのデータ型を返す
未定義値を返す
R
R
R
R
R
R
R
R
R
1
1
1
1
1
1
1
1
1
左辺値→数値
左辺値→数値
数値→数値
数値→数値
整数→整数
論理値→論理値
左辺値→論理値
任意→文字列
任意→未定義値
** べき乗 R 2 数値→数値
*, /, % 乗算、除算、剰余 L 2 数値、数値→数値
+, - 加算、減算 L 2 数値、数値→数値
<<
>>
>>>
左シフト
右シフト
符号なし右ビットシフト
L
L
L
2
2
2
整数、整数→整数
整数、整数→整数
整数、整数→整数
<, <=, >, >=
<, <=, >, >=
instanceof
in
数値順で比較
アルファベット順で比較
オブジェクトのクラスを調べる
プロパティが存在するかを調べる
L
L
L
L
2
2
2
2
数値、数値→論理値
文字列、文字列→論理値
オブジェクト、関数→論理値
文字列、オブジェクト→論理値
==
!=
===
!==
値が等しいかどうかをテストする
値が等しくないかどうかをテストする
値が同じであるかどうかをテストする
値が同じでないかどうかをテストする
L
L
L
L
2
2
2
2
任意、任意→論理値
任意、任意→論理値
任意、任意→論理値
任意、任意→論理値
& ビット単位 AND L 2 整数、整数→整数
^ ビット単位 XOR L 2 整数、整数→整数
| ビット単位 OR L 2 整数、整数→整数
&& 論理 AND L 2 任意、任意→任意
|| 論理 OR L 2 任意、任意→任意
?: 条件演算子 L 3 論理値、任意、任意→任意
=
*=, /=, %=, +=, -=, &=, ^=, |=, <<=, >>=, >>>=
代入
演算を伴う代入
R
R
2
2
左辺値、任意→任意
左辺値、任意→任意
, カンマ演算子 L2任意、任意→任意

オペランドの数

演算子はオペランドの数で 単項演算子二項演算子三項演算子 の 3 種類に大別できます。

単項演算子は 1 つの式を別の式に変換します。例えば、-x の式の - がそれにあたります。二項演算子は 2 つの式を組み合わせて 1 つの式を作ります。例えば、乗算演算子などがそれにあたります。三項演算子は条件演算子のみです。条件演算子は、3 つの式を組み合わせて 1 つの式を作る演算子です。

// 単項演算子
-x;

// 二項演算子
2 * 3;

// 三項演算子
5 > 2 ? true : false;

オペランドと演算結果の型

多くの演算子はオペランドとして、ある特定の型を必要とし、ある特定の型の値を返します。上表の「型」列にオペランドの型と演算子の演算結果の型を示しています。

JavaScript の演算子は必要に応じてオペランドの型を変換します。例えば、乗算演算子はオペランドとして数値を必要とします。しかし "3" * "5" の式は、オペランドを数値に変換するため正常に処理されます。この式の値は数値型の 15 になります。

また値は true と評価されるものと false と評価されるもののどちらかになります。そのため、オペランドとして論理値が必要な演算子でも、任意の型のオペランドに対して問題なく動作します。

オペランドの型によって働きが変わる演算子もいくつかあります。例えば + 演算子の場合、オペランドの型が数値なら加算を実行しますが、オペランドの型が文字列なら連結処理を行います。同様に < などの比較演算子は、オペランドの型によって、数値の大小で比較したり、アルファベット順で比較したりします。

左辺値

代入演算子などいくつかの演算子で、オペランドの型として左辺値を必要とするものがあります。左辺値とは、代入演算子の左側に記述しても問題のない式です。JavaScript の場合は、変数やオブジェクトのプロパティや、配列の要素が左辺値になります。ECMAScript 仕様では、組み込み関数が左辺値を返してもよいことになっています。

演算子の副作用

演算子を使った式の中には副作用を持つものがあります。例えば、変数やプロパティに値を代入すれば、今後その値やプロパティを使う式の値が変化します。同様に、インクリメント演算子や、デクリメント演算子も暗黙的に代入を行うので副作用が生じます。

delete 演算子も副作用があります。なぜなら、プロパティを削除することはプロパティに undefined を代入することと同じ意味になるためです。

演算子の優先順位

上表に列挙した演算子の一覧は、優先順位の高いものから順に並べています。演算子が複数ある場合、優先順位の高い演算子から処理が行われます。

w = x + y * z;

乗算演算子 * の方が加算演算子 + より優先順位が高いので、最初に乗算が行われ、次に加算が行われます。代入演算子 = は優先順位が最も低いので、右側の処理がすべて終了した後に実行されます。

優先順位を変更したい場合は、括弧 ( ) を使用します。上記の例で、加算を実行してから乗算を実行したい場合は次のようにします。

w = (x + y) * z;

プロパティアクセス式と呼び出し式は、すべての演算子よりも優先順位が高くなります。

typeof my.functions[x](y)

typeof は優先順位の高い演算子ですが、プロパティアクセスや関数呼び出しがまず実行され、その結果に対して typeof 演算が行われます。

演算子の結合性

上表で A (associativity) 列は、演算子の結合性を示しています。A 列の L (left-to-right) は左から右に演算子を結合します。R (right-to-left) は右から左へ演算子を結合します。このようなルールは、優先順位が同じ演算子の実行順序を決めるときに必要になります。

w = x - y - z;

減算演算子は左から右に処理されるので、この式は次のように括弧を指定したのと同じです。

w = ((x - y) - z);

単項演算子や代入演算子、条件演算子は右から左へ処理されます。

x = ~-y;
w = x = y = z;
q = a?b:c?d:e?f:g;

上記のコードは、以下のように記述したコードと同じです。

x = ~(-y);
w = (x = (y = z));
q =a?b:(c?d:(e?f:g));

評価順序

演算子の優先順位と結合性により、式の中での演算子の処理順序が決められます。しかし、優先順位と結合性は、個々の式が評価される順序までは指定しません。

JavaScript では、常に式の評価は左から右に行われます。例えば、w = x + y * z の式の場合、まず w が評価され、その後 xyz の順序で評価が行われます。そして yz の値が乗算され x の値と加算され w の式で指定された変数やプロパティに代入が行われます。

評価の順序が問題となるのは、評価される式の中に副作用を持ち、この副作用がほかの式に影響を及ぼす場合です。もしも先ほどの例で z 式で使う変数が x 式の中でインクリメントされる場合 xz よりも前に評価されます。そのため、評価順序には注意してください。

関連記事

JavaScript のまとめページはプログラミング JavaScript 入門を参照してください。

Category:
プログラミング
公開日:
更新日:
Pageviews:
50
Shares:
1
Tag:
JavaScript
hatebu icon
hatebu