式と演算子
この節では、JavaScript 言語のすべての演算子、式、キーワードについて記述しています。
式と演算子(カテゴリー別)
アルファベット順の一覧は左側のサイドバーをご覧ください。
基本式
JavaScript での基本的なキーワードと一般的な式です。これらの式は最も高い優先順位を持ちます(演算子よりも高い)。
this-
thisキーワードは関数の実行コンテキストを示す特別なプロパティです。 - リテラル
-
基本的な
null、論理値、数値、文字列のリテラルです。 []-
配列初期化子またはリテラル構文です。
{}-
オブジェクト初期化子またはリテラル構文です。
function-
functionキーワードは関数式を定義します。 class-
classキーワードはクラス式を定義します。 function*-
function*キーワードはジェネレーター関数式を定義します。 async function-
async functionは非同期関数式を定義します。 async function*-
async function*キーワードは非同期ジェネレーター関数式を定義します。 /ab+c/i-
正規表現リテラル構文です。
`string`-
テンプレートリテラル構文です。
( )-
グループ化演算子です。
左辺式
左辺値は、代入の対象になります。
- プロパティアクセサー
-
プロパティアクセス演算子はオブジェクトのプロパティやメソッドへのアクセス (
object.propertyやobject["property"]) を提供します。 ?.-
オプショナルチェーン演算子は、参照がヌル値(
nullまたはundefined)であった場合にエラーを発生させる代わりにundefinedを返します。 new-
new演算子はコンストラクターのインスタンスを作成します。 new.target-
コンストラクター内で
new.targetを使うことで、newによって呼び出されるコンストラクターを参照できます。 import.meta-
コンテキストに依存したメタデータを JavaScript モジュールへ公開するオブジェクトです。
super-
superキーワードは親オブジェクトのコンストラクターを呼び出したり、親オブジェクトのプロパティにアクセスしたりすることができます。 import()-
import()構文を使うと、モジュールを非同期かつ動的に、潜在的にモジュールでない環境に読み込むことができます。 import.defer()-
import.defer()構文を使用すると、モジュールを動的に読み込み、返された名前空間のプロパティにアクセスされるまで、同期的な評価を遅延させます。 import.source()-
import.source()構文を使用すると、依存関係を読み込んだり、リンクしたり、評価したりすることなく、モジュールのコンパイル済みソースを表すオブジェクトが生成されます。
インクリメントとデクリメント
後置/前置のインクリメント演算子と後置/前置のデクリメント演算子です。
単項演算子
単項演算は、単一のオペランドによる演算です。
算術演算子
算術演算子は、数値(リテラルまたは値)をオペランドとして取り、1 個の数値を返します。
関係演算子
比較演算子はオペランド同士を比較し、その比較結果が真かどうかに基づいて論理値を返します。
等値演算子
等値演算子の評価結果は常に、比較が真かどうかに基づいて論理型の値になります。
ビットシフト演算子
オペランドのすべてのビットをシフト演算します。
バイナリービット演算子
ビット演算子は、そのオペランドを 32 ビット(0 と 1)の並びとして扱い、標準の JavaScript 数値を返します。
バイナリー論理演算子
論理演算子は論理値(ブール値)において実装され、短絡評価があります。
条件(三項)演算子
(条件 ? 真の場合 : 負の場合)-
この条件演算子は、条件の論理値を基に、2 つの値のいずれか一方を返します。
代入演算子
代入演算子は、右オペランドに基づいて、値を左オペランドに代入します。
=-
代入演算子です。
*=-
乗算値を代入します。
/=-
除算値を代入します。
%=-
剰余値を代入します。
+=-
加算値を代入します。
-=-
減算値を代入します。
<<=-
左シフトした値を代入します。
>>=-
右シフトした値を代入します。
>>>=-
符号なしの右シフトした値を代入します。
&=-
ビット論理積 (AND) の値を代入します。
^=-
ビット排他的論理和 (XOR) の値を代入します。
|=-
ビット論理和 (OR) の値を代入します。
**=-
べき乗値を代入します。
&&=-
論理積代入です。
||=-
論理和代入です。
??=-
論理ヌル値合体代入です。
[a, b] = arr,{ a, b } = obj-
構造分解は、配列やオブジェクトのプロパティを、配列やオブジェクトリテラルに似た構文を使用して変数に代入します。
yield 演算子
スプレッド構文
...obj-
スプレッド構文を使用すると、配列や文字列などの反復可能オブジェクトを、 0 個以上の引数(関数呼び出しの場合)や要素(配列リテラルの場合)が予想される配置で展開することができます。オブジェクトリテラルでは、スプレッド構文はオブジェクトのプロパティを列挙し、作成するオブジェクトにキーと値のペアを追加します。
カンマ演算子
,-
カンマ演算子は、複数の式を単一の文で評価し、最後の式の結果を返すことができます。
演算子とは
文、宣言、式とはの節で説明されているように、式とは、評価されて値となる基本的な構成要素です。文、宣言、式はいずれも、式を受け入れる特定のスロットを定義することができます。式の中にさらにネストされた式を受け入れるスロットが含まれている場合、スロットではない部分は演算子と呼ばれます。
例えば、加算式の構文は 式 + 式 です(仕様書を読むと、オペランドは AdditiveExpression と MultiplicativeExpression と呼ばれており、これらはどちらも Expression のサブセットですが、これは仕様書において優先順位と結合規則を定義するための形式的なものであり、ここでは関係ありません)。2 つの式スロットを除けば、ここで導入されるコードエンティティは単に +、すなわち加算演算子に他なりません。同様に、yield 式の構文は yield expression であるため、yield は演算子として知られています。言い換えれば、それぞれの演算子は 1 つの式に対応しています。
MDN では、null のようなスロットのない式についても、以上の上の定義に従って演算子と見なしていますが、実際には常にそれらを単に「構文」や「式」と呼んでいます。
式は、必ずしも決まった数のスロットを持つとは限りません。例えば、配列リテラル式 [式, 式, 式] は、任意の数の式スロットを持つことができます。[,,] の部分は「演算子」と呼ばれることもあります。MDN ではこの用法は避けていますが、Haskell などの関数型プログラミング言語では見かけることがあるかもしれません。
演算子の定義は、他の特定のコードエンティティと組み合わさると、より曖昧になります。式の中に式ではないスロットが含まれていた場合や、式と組み合わされたコードエンティティが式を構成しない場合はどうなるのでしょうか。その場合でも、そのコードエンティティを演算子と呼ぶのでしょうか。
- オプショナルチェーンの式
foo?.barにおいて、fooは式ですが、barは識別子でなければならないので、値として評価されることはありません。この場合でも、?.は演算子と見なされるのでしょうか。 - アロー関数の式
arg => bodyにおいて、bodyは式である場合がありますが(ブロックの本体である場合もあります)、argは単なる引数リストです。この場合でも、=>は演算子と見なされるのでしょうか? - スプレッド構文
...fooにおいて、fooは式ですが、全体としては式とは見なされません。これは、全体として値に評価されないためです。この構文は、関数呼び出し、配列リテラル、オブジェクトリテラルといった特定の式においてのみ意味を持ちます。それでもなお、...を演算子と見なすのでしょうか?
JavaScript で「演算子」という用語は明確に定義されていないため、MDN では決定的な答えを示していません。当サイトでは、これらの構文をすべて「演算子」というカテゴリーに分類していますが、それらを正式に「演算子」と呼ぶことは避けています。演算子に関する多くの有用な概念(優先順位など)は、その正確な性質にかかわらず、これらにも適用されます。