文と宣言
JavaScript のコードは、文と宣言から構成されており、これらには式が含まれることがあります。このリファレンスでは、実行を制御したり、バインディングを宣言したりするために使用される構文をまとめています。1 つの文は複数行にまたがることもあれば、1 行に複数の文が含まれることもあります。
文と宣言(カテゴリ別)
アルファベット順リストは左サイドバーで確認できます。
フロー制御
return-
関数が返す値を指定します。
break-
現在実行中のループ、
switchによる分岐、あるいはラベル文を終了し、その終了した文に続く文へとプログラムの制御を移行します。 continue-
現在実行中のループ、またはラベル付きループで現在反復している文の実行を終了し、そのループの実行を次の反復から継続します。
throw-
ユーザー定義の例外を発生させます。
if...else-
与えられた条件が真の場合はある文を実行します。条件が偽の場合はまた別の文を実行できます。
switch-
ある式を評価し、式の値を case 節と照らし合わせ、 case 節に関連付けられた文を実行します。
try...catch-
実行を試み、例外が発生した際に行うべき処理を規定する文のブロックを記述します。
宣言
var-
変数を宣言し、その変数をある値に初期化することもできます。
let-
ブロックスコープの変数を宣言し、その変数をある値に初期化することもできます。
const-
再代入できないブロックスコープの変数を宣言します。宣言で初期化する必要があります。
using-
同期的に破棄される、
constと同様の変数を宣言します。 await using-
非同期に破棄される、
constと同様の変数を宣言します。
関数とクラス
function-
指定された仮引数を持つ関数を宣言します。
function*-
イテレーターをより簡単に書けるジェネレーター関数です。
async function-
指定した引数を持つの非同期関数を宣言します。
async function*-
非同期ジェネレータ関数により、非同期のイテレーターをより簡単に書くことができます。
class-
クラスを宣言します。
反復処理
do...while-
テスト条件が偽と評価されるまで指定された文を実行するループを作成します。この条件は文が実行されたあとに評価されます。その結果、少なくとも 1 回は指定された文が実行されます。
for-
丸括弧で囲まれ、セミコロンで区切られた 3 つの式と、それに続くループ内で実行される文から構成されるループを作成します。
for...in-
オブジェクトの列挙可能なプロパティに対し任意の順番で反復処理を行います。それぞれ個別のプロパティに対し、文を実行できます。
for...of-
反復可能オブジェクト (配列、配列風オブジェクト、イテレーターとジェネレーターを含む) を反復処理し、それぞれ個別のプロパティの値に対する実行文をともなった反復処理フックを呼び出します。
for await...of-
非同期反復オブジェクト、配列風オブジェクト、イテレーターとジェネレーターを反復処理し、各固有のプロパティ値で実行する文を実行しつつ、カスタムイテレーションフックを実行する。
while-
テスト条件が真と評価される間、指定した文を実行するループを作成します。この条件は文が実行される前に評価されます。
その他
- 空文
-
空文は、文が必要ないが JavaScript の文法上 1 つの文が必要な場合に使います。
- ブロック
-
ブロック文は 0 個以上の文をグループ化するのに使います。ブロックは 1 組の波括弧で囲みます。
- 式文
-
式文は、式を評価し、その結果を破棄します。これにより、関数の実行や変数の更新など、式に付随する効果を実行することができます。
debugger-
利用可能なデバッグ機能を呼び出します。利用可能なデバッグ機能がない場合、この文は無効となります。
export-
外部モジュールや別のスクリプトでインポートできるように、関数をエクスポートするのに使われます。
import-
外部モジュールや別のスクリプトからエクスポートされる関数をインポートするのに使われます。
import defer-
モジュールを名前空間として読み込み、返された名前空間のプロパティにアクセスされるまで、同期的な評価を遅延させます。
import source-
モジュールのコンパイルされたソースを表すオブジェクトを返します。この際、依存関係の読み込み、リンク処理、および評価は行われません。
- ラベル
-
breakやcontinue文を使う際に参照できる識別子を含む文を用意します。 with-
文のスコープチェーンを拡張します。
文、宣言、式とは
すべての JavaScript プログラムは、以上に掲載されている構文のいずれかを使用した、最上位構文の並びで構成されています。これらは文(英語)および宣言(英語)と呼ばれています。MDNドキュメントでは、これら両方を口語的に_文_と呼ぶことがよくありますが、技術的には 2 つの互いに交わらない文法セットです。
以下のものは宣言です。
letconstusingawait usingfunctionfunction*async functionasync function*classexport(注: モジュールの最上位にのみ現れます)import(注: モジュールの最上位にのみ現れます)
前述のリストのうち、それ以外のものはすべて文です。
「文」と「宣言」という用語は、JavaScript の形式文法において厳密な意味を持ち、それがコードのどこに配置されるかに影響します。例えば、ほとんどの制御フロー構造では、本体は文だけを受け入れます。例えば if...else の分岐先などです。)
if (条件)
文1;
else
文2;
もし、文の代わりに宣言を使用した場合、 SyntaxError となります。例えば、let 宣言は文ではないので、 if 文の本体としてそのままの形を使用することはできません。
if (条件)
let i = 0; // SyntaxError: Lexical declaration cannot appear in a single-statement context
一方、var は文なので、それ自身で if 本体として使用することができます。
if (条件)
var i = 0;
宣言は「識別子を値に結びつける」ものであり、文は「アクションを実行する」ものであると考えることができます。なぜなら、var は通常の字句スコープの規則に従わないので、副作用を引き起こす可能性があるからです。グローバル変数の作成、既存の var で定義された変数の変更、ブロックの外から見える変数の定義(var で定義された変数はブロックスコープに入らないため)のような形式です。
他の例として、ラベルは文にのみ付けることができます。
label: const a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
メモ: 関数宣言にラベルを持たせる古い文法がありますが、ウェブの現実との互換性のために標準化されただけです。
これを回避するには、宣言を中括弧で囲んで、ブロック文の一部にすることができます。
label: {
const a = 1;
}
if (条件) {
let i = 0;
}
JavaScript で、文や宣言は値を生成しますが、これらの値が直接観察できることは(eval() を除いて)ほとんどありません。これら目的は、周囲の環境を操作して作用を生み出すこと、つまり変数のバインディングを作成したり、何かを出力したり、変数の値を変更したりすることです。そこで使用される値は、式(英語)の評価から決まります。
式は最上位の構文要素ではありません。式は、if (式) や const x = 式 など、文や宣言内の特定のスロットでしか使用できません。式文 の構文により、ほとんどの式を文として使用できますが、これは単一の式スロットを持つ文にすぎません。
JavaScript の構文構造は、文、宣言、式だけを使って説明することができます。
- 文には、文、宣言、式を含めることができます(
if (式) 文や、ブロック文{ 文; 宣言 }など)。 - 宣言には、文、宣言、式を含めることができます(
function x() { 文; 宣言 }やconst x = 式など)。 - 式には、文、宣言、式を含めることができます(
() => { 文; 宣言 }やconsole.log(式)など)。
各構文要素のリファレンスドキュメントでは、そのすべての「スロット」について説明し、それぞれのスロットが文、宣言、それとも式のいずれであるかを明記してあります。
演算子は、JavaScript の文法におけるもう 1 つの重要な概念ですが、これらは「積み木」のように動作しないものです。詳細については、演算子とはを参照してください。