このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

式と演算子

この節では、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() 構文を使用すると、依存関係を読み込んだり、リンクしたり、評価したりすることなく、モジュールのコンパイル済みソースを表すオブジェクトが生成されます。

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

後置/前置のインクリメント演算子と後置/前置のデクリメント演算子です。

A++

後置型インクリメント演算子。

A--

後置型デクリメント演算子。

++A

前置型インクリメント演算子。

--A

前置型デクリメント演算子。

単項演算子

単項演算は、単一のオペランドによる演算です。

delete

delete 演算子は、オブジェクトからプロパティを削除します。

void

void 演算子は、式の返値を破棄します。

typeof

typeof 演算子は、与えられたオブジェクトの型を判別します。

+

単項正値演算子は、そのオペランドを数値型に変換します。

-

単項負値演算子は、そのオペランドを数値型に変換して正負を反転します。

~

ビット否定演算子です。

!

論理否定演算子です。

await

非同期関数式の停止/再開と、プロミスの履行/拒否を待ちます。

算術演算子

算術演算子は、数値(リテラルまたは値)をオペランドとして取り、1 個の数値を返します。

**

べき乗演算子です。

*

乗算演算子です。

/

除算演算子です。

%

剰余演算子です。

+ (プラス)

加算演算子です。

-

減算演算子です。

関係演算子

比較演算子はオペランド同士を比較し、その比較結果が真かどうかに基づいて論理値を返します。

< (Less than)

小なり演算子です。

> (Greater than)

大なり演算子です。

<=

小なりイコール演算子です。

>=

大なりイコール演算子です。

instanceof

instanceof 演算子は、オブジェクトが別のオブジェクトのインスタンスかどうかを判別します。

in

in 演算子は、与えられたプロパティをオブジェクトが持っているかどうかを判別します。

メモ: => は演算子ではなく、アロー関数のための記法です。

等値演算子

等値演算子の評価結果は常に、比較が真かどうかに基づいて論理型の値になります。

==

等値演算子です。

!=

不等値演算子です。

===

同値演算子です。

!==

非同値演算子です。

ビットシフト演算子

オペランドのすべてのビットをシフト演算します。

<<

ビット左シフト演算子です。

>>

ビット右シフト演算子です。

>>>

ビット符号なし右シフト演算子です。

バイナリービット演算子

ビット演算子は、そのオペランドを 32 ビット(0 と 1)の並びとして扱い、標準の JavaScript 数値を返します。

&

ビット論理積 (AND) です。

|

ビット論理和 (OR) です。

^

ビット排他的論理和 (XOR) です。

バイナリー論理演算子

論理演算子は論理値(ブール値)において実装され、短絡評価があります。

&&

論理積 (AND) です。

||

論理和 (OR) です。

??

ヌル値合体演算子です。

条件(三項)演算子

(条件 ? 真の場合 : 負の場合)

この条件演算子は、条件の論理値を基に、2 つの値のいずれか一方を返します。

代入演算子

代入演算子は、右オペランドに基づいて、値を左オペランドに代入します。

=

代入演算子です。

*=

乗算値を代入します。

/=

除算値を代入します。

%=

剰余値を代入します。

+=

加算値を代入します。

-=

減算値を代入します。

<<=

左シフトした値を代入します。

>>=

右シフトした値を代入します。

>>>=

符号なしの右シフトした値を代入します。

&=

ビット論理積 (AND) の値を代入します。

^=

ビット排他的論理和 (XOR) の値を代入します。

|=

ビット論理和 (OR) の値を代入します。

**=

べき乗値を代入します。

&&=

論理積代入です。

||=

論理和代入です。

??=

論理ヌル値合体代入です。

[a, b] = arr, { a, b } = obj

構造分解は、配列やオブジェクトのプロパティを、配列やオブジェクトリテラルに似た構文を使用して変数に代入します。

yield 演算子

yield

ジェネレーター関数の一時停止と再開を行います。

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 では決定的な答えを示していません。当サイトでは、これらの構文をすべて「演算子」というカテゴリーに分類していますが、それらを正式に「演算子」と呼ぶことは避けています。演算子に関する多くの有用な概念(優先順位など)は、その正確な性質にかかわらず、これらにも適用されます。

仕様書

仕様書
ECMAScript® 2027 Language Specification
# sec-assignment-operators
ECMAScript® 2027 Language Specification
# sec-object-initializer
ECMAScript® 2027 Language Specification
# sec-multiplicative-operators
ECMAScript® 2027 Language Specification
# prod-YieldExpression
ECMAScript® 2027 Language Specification
# sec-equality-operators
ECMAScript® 2027 Language Specification
# sec-async-function-definitions
ECMAScript® 2027 Language Specification
# prod-FormalParameters
ECMAScript® 2027 Language Specification
# sec-unary-plus-operator
ECMAScript® 2027 Language Specification
# sec-subtraction-operator-minus
ECMAScript® 2027 Language Specification
# sec-this-keyword
ECMAScript® 2027 Language Specification
# prod-CoalesceExpression
ECMAScript® 2027 Language Specification
# prod-ArgumentList
ECMAScript® 2027 Language Specification
# sec-relational-operators
ECMAScript® 2027 Language Specification
# sec-async-generator-function-definitions
ECMAScript® 2027 Language Specification
# sec-super-keyword
ECMAScript® 2027 Language Specification
# sec-unsigned-right-shift-operator
ECMAScript® 2027 Language Specification
# sec-generator-function-definitions-runtime-semantics-evaluation
ECMAScript® 2027 Language Specification
# sec-logical-not-operator
ECMAScript® 2027 Language Specification
# sec-exp-operator
ECMAScript® 2027 Language Specification
# sec-import-calls
ECMAScript® 2027 Language Specification
# prod-SpreadElement
ECMAScript® 2027 Language Specification
# sec-null-value
ECMAScript® 2027 Language Specification
# sec-property-accessors
ECMAScript® 2027 Language Specification
# sec-destructuring-assignment
ECMAScript® 2027 Language Specification
# sec-grouping-operator
ECMAScript® 2027 Language Specification
# sec-function-definitions
ECMAScript® 2027 Language Specification
# prod-LogicalANDExpression
ECMAScript® 2027 Language Specification
# prod-LogicalORExpression
ECMAScript® 2027 Language Specification
# prod-AssignmentRestProperty
ECMAScript® 2027 Language Specification
# prod-MethodDefinition
ECMAScript® 2027 Language Specification
# prod-BitwiseANDExpression
ECMAScript® 2027 Language Specification
# prod-OptionalExpression
ECMAScript® 2027 Language Specification
# prod-PropertyDefinition
ECMAScript® 2027 Language Specification
# sec-generator-function-definitions
ECMAScript® 2027 Language Specification
# sec-signed-right-shift-operator
ECMAScript® 2027 Language Specification
# sec-postfix-increment-operator
ECMAScript® 2027 Language Specification
# sec-new-operator
ECMAScript® 2027 Language Specification
# prod-AssignmentRestElement
ECMAScript® 2027 Language Specification
# prod-ComputedPropertyName
ECMAScript® 2027 Language Specification
# prod-BitwiseORExpression
ECMAScript® 2027 Language Specification
# sec-class-definitions
ECMAScript® 2027 Language Specification
# sec-conditional-operator
ECMAScript® 2027 Language Specification
# sec-built-in-function-objects
ECMAScript® 2027 Language Specification
# sec-comma-operator
ECMAScript® 2027 Language Specification
# sec-bitwise-not-operator
ECMAScript® 2027 Language Specification
# sec-addition-operator-plus
ECMAScript® 2027 Language Specification
# sec-delete-operator
ECMAScript® 2027 Language Specification
# prod-BitwiseXORExpression
ECMAScript® 2027 Language Specification
# sec-destructuring-binding-patterns
ECMAScript® 2027 Language Specification
# prod-ImportMeta
ECMAScript® 2027 Language Specification
# sec-postfix-decrement-operator
ECMAScript® 2027 Language Specification
# sec-unary-minus-operator
ECMAScript® 2027 Language Specification
# sec-typeof-operator
ECMAScript® 2027 Language Specification
# sec-void-operator
ECMAScript® 2027 Language Specification
# sec-left-shift-operator
HTML
# integration-with-the-javascript-module-system
HTML
# import-meta-resolve
Source Phase Imports
# sec-left-hand-side-expressions
Deferred Imports Evaluation
# sec-left-hand-side-expressions

ブラウザーの互換性

関連情報