字句文法

この記事は編集レビューを必要としています。ぜひご協力ください

この翻訳は不完全です。英語から この記事を翻訳 してください。

このセクションでは、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のプロセスに影響を与えます。ラインターミネータはregular expressions\sクラスによって一致されます。

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

行終了文字
コードポイント 名称 略語 説明 エスケープシーケンス
U+000A Line Feed <LF> New line character in UNIX systems. \n
U+000D Carriage Return <CR> New line character in Commodore and early Mac systems. \r
U+2028 Line Separator <LS> Wikipedia  
U+2029 Paragraph Separator <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第6版での予約キーワード

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

ECMAScriptの仕様によって今後のキーワードとして下記は予約されています。それらは、現時点では特別な機能を持っていません。しかし、今後、特別な機能を持つかもしれません。だから、それらは、識別子として使用することはできません。これらのキーワードはstrictモード、非strictモードのどちらでも使用することはできません。

  • enum
  • await

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

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

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

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

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

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

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

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

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

他方で、次のことは識別子ですから違法です。それは、予約後なしのIdentifierNameです。識別子は、FunctionDeclarationFunctionExpressionに対して使用されます。

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

Binary数値構文は先頭ゼロに続いて、小文字または大文字のラテン文字"B"(0b または 0B)を使用します。この構文はECMAScript第6版で新しくサポートされたので、下記のブラウザ実装状況をご覧ください。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

Octal数値構文は先頭ゼロに続いて、小文字または大文字のラテン文字"O" (0o または 0O)を使用します。この構文はECMAScript第6版で新しくサポートされたので、下記のブラウザ実装状況をご覧ください。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

Hexadecimal数値構文は先頭ゼロに続いて、小文字または大文字のラテン文字"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つの文字が必要です。

'\u00A9' // "©"

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

ECMAScript第6版で新しくサポートされました。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 statementsはセミコロンで終わる必要があります。それゆえ、 自動セミコロン挿入(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.  Line terminatorまたは"}"が文法で許されず遭遇するとき、セミコロンが前に挿入されます。

{ 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コードポイントエスケープ、テンプレート

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート (有) (有) (有) (有) (有)
二進数リテラルと八進数リテラル
(0b and 0o)
41 25 (25) ? 28 ?
Unicodeコードポイントエスケープ
(\u{})
? 未サポート
バグ 320500
? ? ?
オブジェクトリテラルの簡単な表記法 未サポート 33 (33) 未サポート 未サポート 未サポート
テンプレートリテラル 未サポート 34 (34) 未サポート 未サポート 未サポート
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート (有) (有) (有) (有) (有) (有)
二進数リテラルと八進数リテラル ? 41 33.0 (33) ? ? ?
Unicodeコードポイントエスケープ ? ? 未サポート
バグ 320500
? ? ?
オブジェクトリテラルの簡単な表記法 未サポート 未サポート 33.0 (33) 未サポート 未サポート 未サポート
テンプレートリテラル 未サポート 未サポート 34.0 (34) 未サポート 未サポート 未サポート

Firefox固有のメモ

  • Firefox 5 (JavaScript 1.8.6)以前では、今後の予約されたキーワードはstrictモードではないときに使用されます。このECMAScriptの違反はFirefox 5で修正されました。

関連情報

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

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