Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
このページでは、 JavaScript での字句文法を説明します。JavaScript のソーステキストは、単なる文字の列です。これをインタープリターに理解させるためには、文字列をより構造化された表現に解釈させる必要があります。構文解析の最初の手順は字句解析と呼ばれ、テキストを左から右へスキャンして、個々の原子的な入力要素の列に変換します。一部の入力要素、例えばホワイトスペースやコメントはインタープリターにとって重要ではないので、この手順の後で取り除かれます。それ以外の、例えば識別子、キーワード、リテラル、区切り記号(主に演算子)は、その後の構文解析に使用します。改行文字や複数行のコメントも構文的には重要ではありませんが、不正なトークン列を有効にするために自動セミコロン挿入の処理のガイドとなります。
書式化制御文字は、視覚的表現を有していないものの、テキストの解釈を制御するために使用されます。
| U+200C | Zero width non-joiner | <ZWNJ> | 特定の言語において、合字に接合されることを防ぐために、文字の間に配置されます。(Wikipedia) |
| U+200D | Zero width joiner | <ZWJ> | 特定の言語において、通常は接合されない文字を、接合した形を使用して文字を表示するために文字間に配置されます。 (Wikipedia) |
| U+FEFF | Byte order mark | <BOM> | 記述の先頭において、 Unicode を使用することをマークし、テキストのエンコーディングとバイト順を検出できるようにします。 (Wikipedia) |
JavaScriptのソーステキストでは、 <ZWNJ> と <ZWJ> は識別子部分として扱われ、 <BOM> (テキストの先頭にない場合はゼロ幅のノーブレークスペース <ZWNBSP> とも呼ばれます)はホワイトスペースとして扱われます。
ホワイトスペースはソースのテキストの読みやすさを向上させ、トークンを互いに区別します。これらの文字は通常、コードの機能性には不要なものです。よく Minification tools を使用して、転送する必要があるデータの量を削減するためにホワイトスペースを除去します。
| U+0009 | 文字単位のタブ | <TAB> | 水平タブ | \t |
| U+000B | 行単位のタブ | <VT> | 垂直タブ | \v |
| U+000C | フォームフィード | <FF> | 改ページの制御文字 (Wikipedia) | \f |
| U+0020 | 空白 | <SP> | 通常の空白 | |
| U+00A0 | ノーブレークスペース | <NBSP> | 通常の空白だが、改行を行ってよい位置ではない | |
| U+FEFF | ゼロ幅ノーブレークスペース | <ZWNBSP> | When not at the start of a script, the BOM marker is a normal whitespace character. | |
| その他 | 他の Unicode の空白文字 | <USP> | "Space_Separator" 一般カテゴリーの文字 |
メモ: "White_Space" プロパティがあるが "Space_Separator" 一般カテゴリーにない文字のうち、 U+0009, U+000B, U+000C は JavaScript でもホワイトスペースとして扱われ、 U+0085 NEXT LINE は特別な役割を持たず、他にも改行文字の集合となるものがあります。
メモ: JavaScript エンジンで使用される Unicode 規格が変更されると、プログラムの動作に影響を与える可能性があります。例えば、 ES2016 では参照する Unicode 規格が 5.1 から 8.0.0 にアップグレードされ、その影響で U+180E MONGOLIAN VOWEL SEPARATOR が "Space_Separator" カテゴリーから「書式化(Cf)」カテゴリーに移動し、空白でなくなっています。その結果、" \u180E".trim().length の結果が 0 から 1 に変更されました。
ホワイトスペース文字に加えて、改行文字もソースのテキストの読みやすさを改善するために使用されます。しかし、改行文字は JavaScript の実行に影響を与える場合があり、禁止されている場所もいくらかあります。改行文字は自動セミコロン挿入の処理にも影響を与えます。
字句文法のコンテキスト以外では、ホワイトスペースと改行文字はしばしば同一視されます。例えば、String.prototype.trim() は文字列の最初と最後からすべてのホワイトスペースと改行文字を除去します。正規表現における \s 文字クラスエスケープは、すべてのホワイトスペースと改行文字に一致します。
以下の Unicode コードポイントのみが ECMAScript では改行文字として扱われ、他の改行文字はホワイトスペースとして扱われます (例えば、次の行、 NEL、 U+0085 はホワイトスペースと見なされます)。
| U+000A | ラインフィード | <LF> | UNIX システムでの改行文字です。 | \n |
| U+000D | キャリッジリターン | <CR> | コモドールと初期の Mac システムでの改行文字です。 | \r |
| U+2028 | ラインセパレーター | <LS> | ウィキペディア | |
| U+2029 | 改段落 | <PS> | ウィキペディア |
コメントは、ヒント、メモ、提案、警告を JavaScript のコードに追加するために使用されます。これにより、コードがより読みやすく、より理解しやすいものなります。また、コードが実行されないよう無効にするために使用することができます。これは、貴重なデバッグツールになることがあります。
JavaScript には、コード内にコメントを割り当てる方法が 2 つあります。
1 番目の方法は // コメントです。つまり、これは同じ行にある、その後のすべてのテキストをコメントにします。例えば、
2 番目の方法は /* */ スタイルで、もっとずっと柔軟なものです。
例えば、単一行に利用した場合は次のようになります。
複数行のコメントも下記のように作成することができます。
必要であれば、行の途中でコメントを使用することもできますが、これはコードが読みにくくなることがあるので注意が必要です。
また、コードをコメントで囲むことで、コードが実行されないよう無効にすることができます。
この場合、 console.log() の呼び出しはコメント内部にあるので、実行されることはありません。何行分のコードであっても、このようにして無効にすることができます。
少なくとも 1 つの改行文字を含むブロックコメントは、自動セミコロン挿入において改行文字のように動作します。
特別な 3 つ目のコメント構文としてハッシュバンコメントがあります。ハッシュバンコメントは、 #! で始まることと、スクリプトやモジュールの絶対的な開始位置でのみ有効であることを除いて、単一の行のみ (//) のコメントと全く同じように動作します。なお、 #! の前にはいかなる種類の空白も許されないことにも注意してください。コメントは #! 以降の最初の行の終わりまでのすべての文字で構成され、このようなコメントは 1 つだけ許可されます。
JavaScriptでのハッシュバンコメントは Unix におけるシバンに似ていて、スクリプトを実行するために使用したい特定の JavaScript インタープリターへのパスを指定します。ハッシュバンコメントが標準化される前に、 Node.js のようなブラウザー以外のホストではすでにデファクトとして実装されており、エンジンに渡される前にソーステキストから取り除かれるようになっていました。例として以下のようなものがあります。
JavaScript インタープリターはこれを通常のコメントとして扱います。スクリプトが直接シェルで実行された場合のみ、シェルに対して意味を持ちます。
警告: スクリプトをシェル環境で直接実行できるようにしたい場合は、 BOM のない UTF-8 でエンコードしてください。ブラウザーで実行するコードでは BOM は何の問題も起こしませんが - UTF-8 デコードの際、ソーステキストが解析される前に取り除かれるからです - Unix/Linux のシェルでは、BOM 文字が前にあるとハッシュバンを認識しません。
#! の形のコメントは JavaScript インタープリターを指定するためにだけ使用してください。他の用途ではすべて // のコメント(または複数行コメント)を使用してください。
識別子 は、値と名前をリンクさせるために使用されます。識別子は様々な場所で使用することができます。
JavaScript では、識別子は一般的に英数字、アンダースコア (_)、ドル記号 ($) で構成されます。識別子は数字で始めることはできません。しかし、JavaScript で使用できる識別子は ASCII だけではなく、ほとんどの Unicode コードポイントも使用可能です。
メモ: もし何らかの理由で JavaScript のソースを自分で構文解析する必要がある場合、すべての識別子が /[A-Za-z_$][\w$]*/ のパターンに従っている(つまり ASCII のみである)と仮定しないでください。 識別子の範囲は正規表現 /[$_\p{ID_Start}][$\p{ID_Continue}]*/u (Unicode エスケープシーケンスを除く)で記述することができます。
また、JavaScript では、識別子の中で Unicode エスケープシーケンスを \u0000 または \u{000000} という形式で使用することができ、これは実際の Unicode 文字と同じ文字列値をエンコードするものです。例えば、你好 と \u4f60\u597d は同じ識別子です。
すべての場所で、すべての範囲の識別子が受け入れられるわけではありません。関数宣言、関数式、変数宣言などの特定の構文では、予約語でない識別子名を使用する必要があります。
最も注目すべきは、プライベート要素とオブジェクトプロパティは、予約語を許可していることです。
キーワード は識別子のように見えますが、 JavaScript で特別な意味を持つトークンです。例えば、関数宣言の前のキーワード async は、その関数が非同期であることを示します。
キーワードの中には予約されているものがあり、変数宣言や関数宣言などの識別子として使用することができないことを意味します。これらはよく予約語と呼ばれます。予約語の一覧は下記に掲載されています。すべてのキーワードが予約されているわけではありません。例えば、 async はどこでも識別子として使用することができます。一部のキーワードは文脈的な予約語です。例えば、 await は非同期関数の本体でのみ、 let は厳格モードのコード、または const および let 宣言でのみ予約されています。
識別子は常に 文字列値 で比較されるため、エスケープシーケンスは解釈されます。例えば、このような場合も構文エラーとなります。
これらのキーワードは、 JavaScript で変数、関数、クラスなどの識別子として使用することはできません。
以下のものは、厳格モードのコードで使われた場合のみ予約語になります。
以下のものは、モジュールコードや非同期関数本体に現れた場合にのみ予約語になります。
以下のものは、 ECMAScript の仕様によって今後のキーワードとして予約されています。これらは現時点では特別な機能を持っていませんが、将来は持つ可能性があるので、識別子として使用することはできません。
以下のものは常に予約されています。
以下のものは、厳格モードで遭遇した場合のみ予約語になります。
以前の ECMAScript の仕様書 (ECMAScript 1 から 3 まで) では、以下のものが将来のキーワードとして予約されています。
一部の識別子は、キーワードでなくても、あるコンテキストで特別な意味を持つことがあります。それらは以下の通りです。
メモ: この節では、不可分なトークンであるリテラルについて説明します。オブジェクトリテラルや配列リテラルは、一連のトークンで構成される式です。
詳細については null を参照してください。
詳細については論理型を参照してください。
数値型 (Number) および長整数型 (BigInt) が数値リテラルを使用します。
10 進数リテラルをゼロ (0) から始め、他の 10 進数の数字を続けることができますが、 0 に続く数字がすべて 8 より小さい場合は、その数値が 8 進数として解釈されることに注意してください。さらに、接頭辞 0 を持つ数値リテラルは、 8 進数と 10 進数のどちらで解釈しても、厳格モードでは構文エラーが発生します。ですから、代わりに 0o 接頭辞を使用してください。
10 進数の指数リテラルは、 beN の書式で指定します。ここで b は基数(整数または浮動小数点)、その後に e 文字(セパレーターまたは指数記号として機能)、そして N は指数またはべき乗数 - 符号付き整数です(2019 ECMA-262 仕様に従います)。
2 進数の構文は、先頭のゼロに続いて小文字または大文字のラテン文字 "B" を使用します (0b または 0B)。0o の後に 0 または 1 以外の文字があると、一連のリテラルは終了します。
8 進数の構文は、先頭のゼロに続いて小文字または大文字のラテン文字 "O" を使用します (0o または 0O)。0o の後に範囲 (01234567) から外れた文字があると、一連のリテラルは終了します。
16 進数の構文は、先頭のゼロに続いて小文字または大文字のラテン文字 "X" を使用します (0x または 0X)。0x の後に範囲 (0123456789ABCDEF) から外れた文字があると、一連のリテラルは終了します。
長整数型 (BigInt) は JavaScript の数値プリミティブであり、自由な精度の整数を表すことができます。長整数リテラルは、整数の末尾に n を追加することで作成されます。
長整数リテラルは、古い 8 進数と混同しないよう、0 で始めることはできません。
8 進数の BigInt 数値では、常にゼロの後に "o" (大文字でも小文字でも) を付けて使用してください。
BigInt についての詳細な情報は、 JavaScript のデータ構造を参照してください。
数値リテラルの可読性を高めるために、アンダースコア (_, U+005F) を区切り文字として使用することができます。
なお、以下の制限があります。
文字列リテラルは、単一引用符または二重引用符に囲まれた 0 個以上の Unicode コードポイントです。 Unicode コードポイントはエスケープシーケンスで表すこともできます。以下の引用符を閉じるコードポイントを除いて、すべてのコードポイントが文字列リテラルに現れることができます。
すべてのコードポイントが、エスケープシーケンスの形で現れることができます。文字列リテラルは ECMAScript の文字列値として評価されます。これらの文字列の値を生成する際に、 Unicode コードポイントは UTF-16 エンコードされます。
次の項では、文字列リテラルで利用できるさまざまなエスケープシーケンス(\ の後に 1 つ以上の文字が続くもの)を記述します。以下の一覧に掲載されていないエスケープシーケンスは「等価エスケープ」となり、コードポイントそのものになります。例えば、\z は z と同じです。非推奨の 8 指数エスケープシーケンス構文があり、非推奨の機能、廃止された機能ページに記述されています。これらのエスケープシーケンスの多くは正規表現でも有効です。文字エスケープを参照してください。
特殊文字はエスケープシーケンスを使用してエンコードすることができます。
| \0 | ヌル文字 (U+0000 NULL) |
| \' | 単一引用符 (U+0027 APOSTROPHE) |
| \" | 二重引用符 (U+0022 QUOTATION MARK) |
| \\ | バックスラッシュ (U+005C REVERSE SOLIDUS) |
| \n | 改行 (U+000A LINE FEED; LF) |
| \r | キャリッジリターン (U+000D CARRIAGE RETURN; CR) |
| \v | 垂直タブ (U+000B LINE TABULATION) |
| \t | タブ (U+0009 CHARACTER TABULATION) |
| \b | バックスペース (U+0008 BACKSPACE) |
| \f | ページ送り (U+000C FORM FEED) |
| \ の直後に改行文字 | 空文字列 |
最後のエスケープシーケンス、\ に改行が続くものは、文字列リテラルをその意味を変えずに複数行に分割するのに有益なものです。
バックスラッシュの後に空白文字や他の文字(改行を除く)がないことを確認してください、そうでなければ動作しません。次の行がインデントされている場合、余分な空間が文字列の値にも存在します。
また、+ 演算子を使用して、次のように複数の文字列を連結することもできます。
上記の方法はどちらも同じ文字列になります。
16 進エスケープシーケンスは \x に続いてちょうど 2 桁の 16 進数から成り、 0x0000 から 0x00FF までのコード単位またはコードポイントを表します。
Unicode エスケープシーケンスは \u に続いてちょうど 4 桁の 16 進数から成ります。これで UTF-16 エンコーディングのコード単位を表します。コードポイント U+0000 から U+FFFF までは、コード単位とコードポイントは等しくなります。コードポイント U+10000 から U+10FFFF までは、 2 つのエスケープシーケンスで 2 つのコード単位 (サロゲートペア) を表す必要があります。サロゲートペアはコードポイントで区別されます。
String.fromCharCode() および String.prototype.charCodeAt() も参照してください。
Unicode コードポイントエスケープは \u{ に続いて 16 進数のコードポイントが続き、 } が続きます。 16 進数の値は 0 から 0x10FFFF までの範囲に含まれている必要があります。 U+10000 から U+10FFFF までの範囲のコードポイントを、サロゲートペアとして表す必要はありません。
String.fromCodePoint() または String.prototype.codePointAt() も参照してください。
正規表現リテラルは2つのスラッシュ (/) で囲まれます。字句解析器は、スラッシュが文字クラス ([]) 内に現れない限り、エスケープされていない次のスラッシュまたは行の終わりまでのすべての文字を処理します。一部の文字(すなわち、識別子の一部)は、閉じスラッシュの後に現れることがあり、これはフラグを表します。
字句文法はとても甘く、1 つのトークンとして取得される正規表現リテラルがすべて有効な正規表現とは限りません。
詳細については RegExp を参照してください。
正規表現リテラルは 2 つのスラッシュ (//) で始めることはできません。空の正規表現を指定するには /(?:)/ を使用してください。
一つのテンプレートリテラルは、複数のトークンから成ります。`xxx${(テンプレートの先頭)、}xxx${(テンプレートの中間)、}xxx`(テンプレートの末尾)は個別のトークンであり、これらの間にはどのような式が入ってもかまいません。
詳細について、テンプレートリテラルを参照してください。
一部の JavaScript 文は、末尾にセミコロン (;) が必要です。これには次のようなものがあります。
しかし、JavaScriptはこの言語をより手軽で便利なものにするために、トークンストリームを処理する際にセミコロンを自動的に挿入することがあり、不正なトークン列を有効な構文に「修正」することができます。この手順は、プログラムテキストが字句文法に従ってトークンに解釈された後に行われます。セミコロンが自動的に挿入されるケースは 3 つあります。
1. 文法上許されないトークンに出会ったとき、それが前のトークンから少なくとも 1 つの改行文字(1 つ以上の改行を含むブロックコメントを含む)で区切られているか、そのトークンが "}" であれば、その前にセミコロンが挿入されます。
do...while の末尾の ")" は、このルールでも特別なケースとして扱われます。
しかし、セミコロンが for 文の頭の区切り文字になる場合は、セミコロンは挿入されません。
また、セミコロンが空文として挿入されることもありません。例えば、下記のコードで ")" の後にセミコロンが挿入された場合、空の文がif文の本体となり、const 宣言が別個の文となるため、このコードは有効になります。しかし、自動的に挿入されたセミコロンは空文にはならないため、宣言が if 文の本体となってしまい、無効になります。
2. トークンの入力ストリームの末尾が検出され、パーサーが単一の入力ストリームを完全なプログラムとして解釈できない場合、末尾にセミコロンが挿入されます。
このルールは前回のルールを補完するもので、特に「問題のあるトークン」がなく、入力ストリームが終わっている場合を想定しています。
3. 文法上で改行が禁止されている場所で改行が見つかった場合は、セミコロンを挿入します。このような場所は、以下の通りです。
ここで ++ は、変数 b に適用される後置演算子としては扱われません。というのも、改行文字が b と++ の間にあるからです。
ここでは、 return 文は undefined を返し、 a + b は到達できない文になります。
ASI は、改行がなければ無効な構文を生成するようなトークンを区切った場合にのみ発生することに注意してください。次のトークンが有効な構文の一部として解釈できる場合は、セミコロンは挿入されません。例えば、
() は関数呼び出しと見なせるので、通常は ASI が発生しないでしょう。同様に、 [] はメンバーアクセスである可能性があります。上のコードは次のものと同等です。
これは有効な構文になります。1[1,2,3] はカンマで結合された式のプロパティアクセサーです。そのため、コードを実行すると "1 is not a function" や "Cannot read properties of undefined (reading 'forEach')" などのエラーが発生することになります。
クラス内では、クラスフィールドやジェネレーターメソッドも落とし穴になることがあります。
これは次のようになります。
したがって、 { のあたりで構文エラーになります。
セミコロンなしのスタイルを強制したい場合、ASI を扱うには以下の経験則があります。
後置型 ++ および -- はオペランドと同じ行に置きましょう。
return, throw, yield の後の式は、キーワードと同じ行に置きましょう。
同様に、break や continue の後のラベル識別子は、キーワードと同じ行に置きましょう。
アロー関数の => は引数と同じ行に置きましょう。
非同期関数やメソッドなどの async の直後に改行を置くことはできません。
using キーワードを using 文および await using 文で使用する場合、宣言する最初の識別子と同じ行に記述する必要があります。
(, [, `, +, -, / (正規表現リテラルとして)のいずれかで始まる行は、その前にセミコロンを置くか、前の行をセミコロンで終わらせるかしましょう。
クラスのフィールドは、できれば常にセミコロンで終わるようにしましょう。一つ前のルール(フィールド宣言の後に計算されたプロパティが続くと、その後は [ で始まる)に加えて、セミコロンはフィールド宣言とジェネレーターメソッドの間にも必要です。
| ECMAScript® 2027 Language Specification |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 2025年9月11日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.