この記事は編集レビューを必要としています。ぜひご協力ください。
この翻訳は不完全です。英語から この記事を翻訳 してください。
このセクションでは、JavaScriptの語彙文法について説明します。ECMAScriptスクリプトのソーステキストは、左から右へスキャンされ、トークン、制御文字、行末、コメント、ホワイトスペースである入力要素のシーケンスに変換されます。ECMAScriptも、特定のキーワードとリテラルを定義し、ステートメントを終了するにはセミコロンを自動挿入するためのルールがあります。
制御文字
制御文字は、視覚的表現を有していないが、テキストの解釈を制御するために使用されます。
コードポイント | 名称 | 略語 | 説明 |
---|---|---|---|
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
加えて、リテラルnull
、 true
、 false
は、通常の使用に対してECMAScriptで予約されています。
予約されている単語の使用
予約語は実際には識別子に適用されます(vs. IdentifierNames
)。es5.github.com/#A.1に記載されるように、これらは、ReservedWords
を除外しないすべてのIdentifierNames
です。
a.import a["import"] a = { import: "test" }.
他方で、次のことは識別子ですから違法です。それは、予約後なしのIdentifierName
です。識別子は、FunctionDeclaration
やFunctionExpression
に対して使用されます。
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
オブジェクトリテラル
詳細について、Object
と Object 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 statementimport
,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) The definition of 'Lexical Conventions' in that specification. |
Standard | |
ECMAScript 6 (ECMA-262) The definition of 'Lexical Grammar' in that specification. |
勧告候補 | 追加: 二進数リテラル と 八進数リテラル、Unicodeコードポイントエスケープ、テンプレート |
ブラウザ実装状況
機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
基本サポート | (有) | (有) | (有) | (有) | (有) |
二進数リテラルと八進数リテラル ( 0b and 0o ) |
41 | 25 (25) | ? | 28 | ? |
Unicodeコードポイントエスケープ ( \u{} ) |
? | 未サポート バグ 952985 |
? | ? | ? |
オブジェクトリテラルの簡単な表記法 | 未サポート | 33 (33) | 未サポート | 未サポート | 未サポート |
テンプレートリテラル | 未サポート | 34 (34) | 未サポート | 未サポート | 未サポート |
機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
基本サポート | (有) | (有) | (有) | (有) | (有) | (有) |
二進数リテラルと八進数リテラル | ? | 41 | 33.0 (33) | ? | ? | ? |
Unicodeコードポイントエスケープ | ? | ? | 未サポート バグ 952985 |
? | ? | ? |
オブジェクトリテラルの簡単な表記法 | 未サポート | 未サポート | 33.0 (33) | 未サポート | 未サポート | 未サポート |
テンプレートリテラル | 未サポート | 未サポート | 34.0 (34) | 未サポート | 未サポート | 未サポート |
Firefox固有のメモ
- Firefox 5 (JavaScript 1.8.6)以前では、今後の予約されたキーワードはstrictモードではないときに使用されます。このECMAScriptの違反はFirefox 5で修正されました。