このセクションでは、JavaScript の語彙文法について説明します。ECMAScript スクリプトのソーステキストは、左から右へスキャンされ、トークン、制御文字、行末、コメント、ホワイトスペースである入力要素のシーケンスに変換されます。ECMAScript も、特定のキーワードとリテラルを定義し、ステートメントを終了するにはセミコロンを自動挿入するためのルールがあります。

制御文字

制御文字は、視覚的表現を有していないが、テキストの解釈を制御するために使用されます。

Unicode の書式制御文字
コードポイント 名称 略語 説明
U+200C ゼロ幅非ジョイナー <ZWNJ> 特定の言語での合字に接続されることを防ぐために、文字の間に配置されます。(Wikipedia).
U+200D ゼロ幅ジョイナー <ZWJ> 通常、特定の言語で、その接続されたフォームを使用してレンダリングされる文字を起こさせるために接続されない文字の間に配置されました(Wikipedia).
U+FEFF バイトオーダーマーク <BOM> スクリプトの開始時に使用すると、Unicode とテキストのバイト順序としてそれをマークします(Wikipedia).

ホワイトスペース

空白文字は、ソーステキストおよび互いに別々のトークンの読みやすさを向上させます。これらの文字は、通常、コードの機能には不要です。Minification tools は、頻繁に転送する必要があるデータの量を削減するために空白文字を除去するために使用されます。

ホワイトスペース文字
コードポイント 名称 略語 説明 エスケープシーケンス
U+0009 キャラクター集計 <HT> 水平タブ \t
U+000B 行集計 <VT> 垂直タブ \v
U+000C フォームフィード <FF> 改ページの制御文字 (Wikipedia). \f
U+0020 スペース <SP> ノーマルスペース  
U+00A0 ノーブレークスペース <NBSP> ノーマルスペース。but no point at which a line may break  
Others 他の Unicode の空白文字 <USP> Spaces in Unicode on Wikipedia  

ラインターミネータ

空白文字に加えて、行終端文字は、ソーステキストの読みやすさを改善するために使用されます。しかしながら、いくつかのケースでは、ラインターミネータは、禁止されているいくつかの場所があるように、JavaScript コードの実行に影響を与えることができます。ラインターミネータは、automatic semicolon insertion のプロセスに影響を与えます。ラインターミネータは正規表現の \s クラスによってマッチします。

次の Unicode コードポイントのみ ECMAScript ではラインターミネータとして扱われ、他の改行文字はホワイトスペースとして扱われます。(例えば、次の行、NEL、U+0085 はホワイトスペースとして考えられます)。

行終了文字
コードポイント 名称 略語 説明 エスケープシーケンス
U+000A ラインフィード <LF>

UNIX システムでの改行文字。

\n
U+000D キャリッジリターン <CR> コモドールと初期の Mac システムでの改行文字 \r
U+2028 ラインセパレーター <LS> Wikipedia  
U+2029 パラグラフセパレーター <PS> Wikipedia  

コメント

コメントは、ヒント、メモ、提案、警告を JavaScript のコードに追加するために使用されます。これは、読みやすく、理解しやすいものにすることができます。また、実行されることを防止するためのコードを無効にするために使用することができます。; これは、貴重なデバッグツールとなります。

JavaScript は、コード内のコメントを割り当てる 2 つの方法があります。

一番目の方法は//コメントです。つまり、これは同じ行にある、続くすべてのテキストをコメントにします。例えば、:

function comment() {
  // This is a one line JavaScript comment
  console.log('Hello world!');
}
comment();

二番目の方法は/* */スタイルです。それは、はるかに柔軟です。

例えば、単一の行にそれを使用することができます:

function comment() {
  /* This is a one line JavaScript comment */
  console.log('Hello world!');
}
comment();

複数行のコメントも下記のように作成することができます。:

function comment() {
  /* This comment spans multiple lines. Notice
     that we don't need to end the comment until we're done. */
  console.log('Hello world!');
}
comment();

これはコードを読みにくくする場合もあって慎重に使用する必要がありますが、ご希望の場合、行の途中でコメントを使用することもできます。:

function comment(x) {
  console.log('Hello ' + x /* insert the value of x */ + ' !');
}
comment('world');

加えて、次のようにコメント内のコードをラップすることによって、それが実行されるのを防ぐために使用して、コードを無効にできます。:

function comment() {
  /* console.log('Hello world!'); */
}
comment();

この場合に、console.log()呼び出しは、コメント内部にあるので、発行されることはありません。何行のコードであっても、このようにして無効にできます。

キーワード

ECMAScript 2015 での予約キーワード

今後の予約済みキーワード

ECMAScript の仕様によって今後のキーワードとして下記は予約されています。それらは、現時点では特別な機能を持っていません。しかし、今後、特別な機能を持つかもしれません。

これは常に予約されています:

  • enum

strict モードのコードで次のキーワードが見つかるときのみ、予約されています:

  • implements
  • package
  • protected
  • static
  • interface
  • private
  • public

モジュールコードで次のキーワードが見つかるときのみ、予約されています:

  • await

旧仕様にある今後予約されているキーワード

旧ECMAScript の仕様(ECMAScript 1 から 3 まで)で次のキーワードは今後のキーワードとして予約されています。

  • abstract
  • boolean
  • byte
  • char
  • double
  • final
  • float
  • goto
  • int
  • long
  • native
  • short
  • synchronized
  • throws
  • transient
  • volatile

加えて、リテラル nulltruefalse は、通常の使用に対して ECMAScript で予約されています。

予約されている単語の使用

予約語は実際には識別子に適用されます(vs. IdentifierNames)。es5.github.com/#A.1 に記載されるように、これらは、ReservedWords を除外しないすべての IdentifierNames です。

a.import
a['import']
a = { import: 'test' }.

他方で、識別子であるため、次のことは違法です。それは、予約後なしの IdentifierName です。識別子は、FunctionDeclaration, FunctionExpression, VariableDeclaration などに対して使用されます。IdentifierNamesFunctionDeclarationFunctionExpression などに対して使用されます。

function import() {} // Illegal.

リテラル

Null リテラル

詳細について、null をご覧ください。

null

Boolean リテラル

詳細について、Boolean をご覧ください。

true
false

Numeric リテラル

Decimal

1234567890
42

// Caution when using leading zeros:
0888 // 888 parsed as decimal
0777 // parsed as octal, 511 in decimal

decimal リテラルは、ゼロ(0)で始まり、別の decimal数字が続くが、0 に続く次の数字が8 より小さい場合、その数は 8進数として解析されることに注意して下さい。これは、JavaScript ではスローしません。バグ 957513をご覧ください。parseInt()ページもご覧ください。

Binary

2進数数値構文は先頭ゼロに続いて、小文字または大文字のラテン文字"B"(0b または 0B)を使用します。この構文は ECMAScript 2015 で新しくサポートされたので、下記のブラウザー実装状況をご覧ください。0b の後の数字が 0 または 1でない場合、次の SyntaxError がスローされます: "Missing binary digits after 0b".

var FLT_SIGNBIT  = 0b10000000000000000000000000000000; // 2147483648
var FLT_EXPONENT = 0b01111111100000000000000000000000; // 2139095040
var FLT_MANTISSA = 0B00000000011111111111111111111111; // 8388607

Octal

8進数数値構文は先頭ゼロに続いて、小文字または大文字のラテン文字"O" (0o または 0O)を使用します。この構文は ECMAScript 2015 で新しくサポートされたので、下記のブラウザー実装状況をご覧ください。0o の後の数字が範囲 (01234567) 外の場合、次の SyntaxError がスローされます; "Missing octal digits after 0o".

var n = 0O755; // 493
var m = 0o644; // 420

// Also possible with leading zeros (see note about decimals above)
0755
0644

Hexadecimal

16進数数値構文は先頭ゼロに続いて、小文字または大文字のラテン文字"X" (0x または 0X)を使用します。0x の後の数字が範囲 (0123456789ABCDEF) 外の場合、次の SyntaxError がスローされます: "Identifier starts immediately after numeric literal".

0xFFFFFFFFFFFFFFFFF // 295147905179352830000
0x123456789ABCDEF   // 81985529216486900
0XA                 // 10

オブジェクトリテラル

詳細について、ObjectObject initializer をご覧ください。

var o = { a: "foo", b: "bar", c: 42 };

// shorthand notation. New in ES6
var a = "foo", b = "bar", c = 42;
var o = {a, b, c};
// instead of
var o = { a: a, b: b, c: c };

配列リテラル

詳細について、Arrayをご覧ください。

[1954, 1974, 1990, 2014]

文字列リテラル

'foo'
"bar"

16進数エスケープシーケンス

'\xA9' // "©"

Unicode エスケープシーケンス

Unicode エスケープシーケンスは\u に続く少なくとも4つの文字が必要です。それぞれが UTF-16 エンコーディングの 2 バイト文字を指定します。0 から FFFF までのコードポイントで、数字がコードポイントに一致しています。より高いコードポイントでは文字をエンコードするのに使うサロゲートペアを表す 2 つのエスケープシーケンスが必要です。サロゲートペアはコードポイントで区別できます。

'\u00A9' // "©"

Unicode コードポイントエスケープ

ECMAScript 2015 で新しくサポートされました。Unicode コードポイントエスケープを用いて、どんな文字でも、16進数を使用してエスケープされます。そのため、0x10FFFF まで Unicode コードポイントを使用することが可能です。簡単な Unicode エスケープで、同じことを達成するために、別途サロゲートの半分を記述することがしばしば必要です。

String.fromCodePoint() または String.prototype.codePointAt()をご覧ください。

'\u{2F804}'

// the same with simple Unicode escapes
'\uD87E\uDC04'

正規表現リテラル

詳細について、RegExp をご覧ください。

/ab+c/g

// An "empty" regular expression literal
// The empty non-capturing group is necessary 
// to avoid ambiguity with single-line comments.
/(?:)/

テンプレートリテラル

詳細について、template strings をご覧ください。

`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tag `string text ${expression} string text`

自動セミコロン挿入

いくつかの JavaScript 文はセミコロンで終わる必要があります。それゆえ、自動セミコロン挿入(ASI)によって影響を受けます。:

  • Empty statement
  • let, const, variable statement
  • import, export, module declaration
  • Expression statement
  • debugger
  • continue, break, throw
  • return

ECMAScript仕様では、 three rules of semicolon insertion に言及します。

1.  文法で許されないラインターミネータまたは "}" が起こる時、セミコロンが前に挿入されます。

{ 1 2 } 3 

// is transformed by ASI into 

{ 1 2 ;} 3;

2.  トークンの入力ストリームの終わりが検出されパーサが完璧なプログラムとして単一の入力ストリームをパースできないとき、セミコロンが終わりに挿入されます。

ここで、++ は、変数 b に適用する postfix operator として扱われません。というのも、ラインターミネータが b++ の間に発生するからです。

a = b
++c

// is transformend by ASI into

a = b;
++c;

3. 文法で制限された作成のステートメントにラインターミネータが続くとき、セミコロンが終わりに挿入されます。"no LineTerminator here"ルールを持つこれらのステートメントは下記のとおりです:

  • PostfixExpressions (++ and --)
  • continue
  • break
  • return
  • yield, yield*
  • module
return
a + b

// is transformed by ASI into

return;
a + b;

仕様

仕様 ステータス コメント
ECMAScript第1版 標準 初期定義。
ECMAScript 5.1 (ECMA-262)
Lexical Conventions の定義
標準  
ECMAScript 2015 (6th Edition, ECMA-262)
Lexical Grammar の定義
標準 追加: 二進数リテラル と 八進数リテラル、Unicode コードポイントエスケープ、テンプレート
ECMAScript Latest Draft (ECMA-262)
Lexical Grammar の定義
ドラフト  

ブラウザー実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
Array literals ([1, 2, 3]) あり あり1 あり あり あり
Binary numeric literals (0b)411225 ?289
Boolean literals (true/false) あり あり1 あり あり あり
Decimal numeric literals (1234567890) あり あり1 あり あり あり
Hexadecimal escape sequences ('\0xA9') あり あり1 あり あり あり
Hexadecimal numeric literals (0xAF) あり あり1 あり あり あり
Null literal (null) あり あり1 あり あり あり
Octal numeric literals (0o)411225 ?289
Regular expression literals (/ab+c/g) あり あり1 あり あり あり
String literals ('Hello world') あり あり1 あり あり あり
Unicode escape sequences ('\u00A9') あり あり1 あり あり あり
Unicode point escapes (\u{})441240 なし319
Shorthand notation for object literals431233 なし309
Template literals411234 なし289
Trailing commas あり あり1 あり あり あり
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Array literals ([1, 2, 3]) あり あり あり4 あり あり あり
Binary numeric literals (0b)4141122528 あり4.0
Boolean literals (true/false) あり あり あり4 あり あり あり
Decimal numeric literals (1234567890) あり あり あり4 あり あり あり
Hexadecimal escape sequences ('\0xA9') あり あり あり4 あり あり あり
Hexadecimal numeric literals (0xAF) あり あり あり4 あり あり あり
Null literal (null) あり あり あり4 あり あり あり
Octal numeric literals (0o)4141122528 あり4.0
Regular expression literals (/ab+c/g) あり あり あり4 あり あり あり
String literals ('Hello world') あり あり あり4 あり あり あり
Unicode escape sequences ('\u00A9') あり あり あり4 あり あり あり
Unicode point escapes (\u{})4444124031 ?4.0
Shorthand notation for object literals4343123330 ?4.0
Template literals4141123428 ?4.0
Trailing commas あり あり あり4 あり あり あり

関連情報

ドキュメントのタグと貢献者

このページの貢献者: Uemmra3, ambi, shide55
最終更新者: Uemmra3,