aboutsummaryrefslogtreecommitdiff
path: root/files/ja/web/javascript/reference/lexical_grammar/index.md
blob: b77599450f585ef44b96457763004c0ccb6e365a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
---
title: 字句文法
slug: Web/JavaScript/Reference/Lexical_grammar
tags:
  - ガイド
  - JavaScript
  - キーワード
  - 字句文法
  - リテラル
browser-compat: javascript.grammar
translation_of: Web/JavaScript/Reference/Lexical_grammar
---
{{JsSidebar("More")}}

このページでは、 JavaScript の字句文法について説明します。 ECMAScript スクリプトのソーステキストは、左から右へスキャンされ、入力要素、すなわちトークン、制御文字、行末、コメント、[ホワイトスペース](/ja/docs/Glossary/Whitespace)の並びに変換されます。 ECMAScript も、特定のキーワードとリテラルを定義しており、文を終了するにはセミコロンを自動挿入するためのルールがあります。

## 制御文字

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

| コードポイント | 名前                  | 略語 | 説明                                                                                                                                                                                                                    |
| ---------- | --------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `U+200C`   | Zero width non-joiner | \<ZWNJ>      | 特定の言語において、合字に接合されることを防ぐために、文字の間に配置されます。([Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%BC%E3%83%AD%E5%B9%85%E9%9D%9E%E6%8E%A5%E5%90%88%E5%AD%90)).                                                                   |
| `U+200D`   | Zero width joiner     | \<ZWJ>       | 特定の言語において、通常は接合されない文字を、接合した形を使用して文字を表示するために文字間に配置されます。 ([Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%BC%E3%83%AD%E5%B9%85%E6%8E%A5%E5%90%88%E5%AD%90)) |
| `U+FEFF`   | Byte order mark       | \<BOM>       | 記述の先頭において、 Unicode を使用することと、そのテキストのバイト順をマークします。 ([Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF)).                                                                                  |

## ホワイトスペース

[ホワイトスペース](/ja/docs/Glossary/Whitespace)はソースのテキストの読みやすさを向上させ、トークンを互いに区別します。これらの文字は通常、コードの機能性には不要なものです。よく [Minification tools](https://en.wikipedia.org/wiki/Minification_%28programming%29) を使用して、転送する必要があるデータの量を削減するためにホワイトスペースを除去します。

| コードポイント | 名前                           | 略語 | 説明                                                                                               | エスケープシーケンス |
| ---------- | ------------------------------ | ------------ | --------------------------------------------------------------------------------------------------------- | --------------- |
| U+0009     | 文字単位のタブ           | \<HT>        | 水平タブ                                                                                     | \t              |
| U+000B     | 行単位のタブ                | \<VT>        | 垂直タブ                                                                                       | \v              |
| U+000C     | フォームフィード                      | \<FF>        | 改ページの制御文字 ([Wikipedia](http://en.wikipedia.org/wiki/Page_break#Form_feed))        | \f              |
| U+0020     | 空白                          | \<SP>        | 通常の空白                                                                                              |                 |
| U+00A0     | ノーブレークスペース                 | \<NBSP>      | 通常の空白だが、改行を行ってよい位置ではない                                                      |                 |
| Others     | 他の Unicode の空白文字 | \<USP>       | [Spaces in Unicode on Wikipedia](https://en.wikipedia.org/wiki/Space_%28punctuation%29#Spaces_in_Unicode) |                 |

## 行末文字

[ホワイトスペース](/ja/docs/Glossary/Whitespace)文字に加えて、行末文字もソースのテキストの読みやすさを改善するために使用されます。しかし、行末文字は JavaScript の実行に影響を与える場合があり、禁止されている場所もいくらかあります。行末文字は[自動的なセミコロンの挿入](#automatic_semicolon_insertion)の処理にも影響を与えます。行末文字は[正規表現](/ja/docs/Web/JavaScript/Guide/Regular_Expressions)の **\s** クラスに一致します。

以下の Unicode コードポイントのみが ECMAScript では行末文字として扱われ、他の改行文字はホワイトスペースとして扱われます (例えば、次の行、 NEL、 U+0085 はホワイトスペースと見なされます)。

| コードポイント | 名前                | 略語 | 説明                                            | エスケープシーケンス |
| ---------- | ------------------- | ------------ | ------------------------------------------------------ | --------------- |
| U+000A     | ラインフィード      | \<LF>        | UNIX システムでの改行文字です。                    | \n              |
| U+000D     | キャリッジリターン  | \<CR>        | コモドールと初期の Mac システムでの改行文字です。 | \r              |
| U+2028     | ラインセパレーター  | \<LS>        | [Wikipedia](https://en.wikipedia.org/wiki/Newline)     |                 |
| U+2029     | 改段落              | \<PS>        | [Wikipedia](https://en.wikipedia.org/wiki/Newline)     |                 |

## コメント

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

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

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

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

2 番目の方法は `/* */` スタイルで、もっとずっと柔軟なものです。

例えば、単一行に利用した場合は次のようになります。

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

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

```js
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();
```

必要であれば、行の途中でコメントを使用することもできますが、これはコードが読みにくくなることがあるので注意が必要です。

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

また、コードをコメントで囲むことで、コードが実行されないよう無効にすることができます。

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

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

## ハッシュバンコメント

特殊な 3 番目のコメントの構文である**ハッシュバンコメント**は、 ECMAScript で標準化の途中にあるものです([Hashbang Grammar proposal](https://github.com/tc39/proposal-hashbang) を参照してください)。

ハッシュバンコメントは、ちょうど単一行コメント (`//`) のように動作しますが、 `#!` で始まり、**スクリプトやモジュールの絶対的な開始位置にある場合のみ有効**です。 `#!` の前にホワイトスペースも許されないことに注意してください。このコメントは `#!` の後から最初の行の末尾までのすべての文字で構成されます。このコメントは 1 つだけが許可されます。

ハッシュバンコメントは、スクリプトを実行したい特定の JavaScript インタープリターへのパスを指定します。例えば次のようになります。

```js
#!/usr/bin/env node

console.log("Hello world");
```

> **Note:** JavaScript のハッシュバンコメントは、ファイルを正しいインタープリターで実行するために使用される [UNIX のシバン](https://en.wikipedia.org/wiki/Shebang_(Unix))を模倣したものです。

> **Warning:** スクリプトをシェル環境で直接実行できるようにしたい場合は、 [BOM](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF) のない UTF-8 でエンコードしてください。ハッシュバンコメントの前に BOM があってもブラウザーでは動作しますが、ハッシュバンのあるスクリプトで BOM を使用することは推奨されていません。 BOM は Unix/Linux のシェル環境でスクリプトを実行しようとすると動作しません。したがって、シェル環境から直接スクリプトを実行したい場合は BOM のない UTF-8 を使用してください。

`#!` の形のコメントは JavaScript インタープリターを指定するためにだけ使用してください。他の用途ではすべて `//` のコメント (または複数行コメント) を使用してください。

## キーワード

### ECMAScript 2015 における予約キーワード

- {{jsxref("Statements/break", "break")}}
- {{jsxref("Statements/switch", "case")}}
- {{jsxref("Statements/try...catch", "catch")}}
- {{jsxref("Statements/class", "class")}}
- {{jsxref("Statements/const", "const")}}
- {{jsxref("Statements/continue", "continue")}}
- {{jsxref("Statements/debugger", "debugger")}}
- {{jsxref("Statements/switch", "default")}}
- {{jsxref("Operators/delete", "delete")}}
- {{jsxref("Statements/do...while", "do")}}
- {{jsxref("Statements/if...else", "else")}}
- {{jsxref("Statements/export", "export")}}
- {{jsxref("Statements/class", "extends")}}
- {{jsxref("Statements/try...catch", "finally")}}
- {{jsxref("Statements/for", "for")}}
- {{jsxref("Statements/function", "function")}}
- {{jsxref("Statements/if...else", "if")}}
- {{jsxref("Statements/import", "import")}}
- {{jsxref("Operators/in", "in")}}
- {{jsxref("Operators/instanceof", "instanceof")}}
- {{jsxref("Operators/new", "new")}}
- {{jsxref("Statements/return", "return")}}
- {{jsxref("Operators/super", "super")}}
- {{jsxref("Statements/switch", "switch")}}
- {{jsxref("Operators/this", "this")}}
- {{jsxref("Statements/throw", "throw")}}
- {{jsxref("Statements/try...catch", "try")}}
- {{jsxref("Operators/typeof", "typeof")}}
- {{jsxref("Statements/var", "var")}}
- {{jsxref("Operators/void", "void")}}
- {{jsxref("Statements/while", "while")}}
- {{jsxref("Statements/with", "with")}}
- {{jsxref("Operators/yield", "yield")}}

### 今後の予約キーワード

以下のものは、 ECMAScript の仕様によって今後のキーワードとして予約されています。これらは現時点では特別な機能を持っていませんが、将来は持つ可能性があるので、識別子として使用することはできません。

以下のものは常に予約されています。

- `enum`

以下のものは、厳格モードで遭遇した場合のみ予約語になります。

- `implements`
- `interface`
- {{jsxref("Statements/let", "let")}}
- `package`
- `private`
- `protected`
- `public`
- `static`
- {{jsxref("Operators/yield", "yield")}}

以下のものは、モジュールコードで遭遇した場合のみ予約語になります。

- `await`

#### 旧仕様にあった今後の予約キーワード

以前の ECMAScript の仕様書 (ECMAScript 1 から 3 まで) では、以下のものが将来のキーワードとして予約されています。

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

加えて、 `null`, `true`, `false` の各リテラルは、 ECMAScript では識別子として使用することができません。

### 予約語の使用

予約語は実際には (*IdentifierName* ではなく) 識別子にのみ適用されます。 [ECMAScript Lexical Grammar](https://tc39.es/ecma262/multipage/grammar-summary.html#sec-lexical-grammar) に記載されているように、これらはすべて *IdentifierName* であり、*ReservedWord* を除外しません。

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

一方、以下のものは _Identifier_ であり、_IdentifierName_ から予約語を除外したものであるからです。識別子は、_FunctionDeclaration_, _FunctionExpression_, _VariableDeclaration_ などのために使用されます。 _IdentifierNames__MemberExpression_, _CallExpression_ などについて使用されます。

```js
function import() {} // 違反
```

### 特別な意味を持つ識別子

一部の識別子は、キーワードでなくても、あるコンテキストで特別な意味を持つことがあります。それらは以下の通りです。

- {{jsxref("Functions/arguments", "arguments")}}
- {{jsxref("Functions/get", "get")}}
- {{jsxref("Functions/set", "set")}}

## リテラル

### Null リテラル

詳細については {{jsxref("null")}} をご覧ください。

```js
null
```

### 論理値リテラル

詳細については[論理型](/ja/docs/Web/JavaScript/Data_structures#論理型_boolean)をご覧ください。

```js
true
false
```

### 数値リテラル

[数値型](/ja/docs/Web/JavaScript/Data_structures#数値型_number) (Number) および[長整数型](/ja/docs/Web/JavaScript/Data_structures#長整数型_bigint) (Number) が数値リテラルを使用します。

#### 10 進数

```js
1234567890
42

// 先頭にゼロがあるものを使用する場合は注意してください
0888 // 888 は 10 進数として解釈されます
0777 // 8 進数として解釈され、 10 進数では 511 です。
```

なお、 10 進数リテラルはゼロ (`0`) から始め、他の 10 進数の数字を続けることができますが、 `0` に続く数字がすべて 8 より小さい場合は、その数値が 8 進数として解釈されることに注意してください。 JavaScript では、この場合に例外が発生しませんので、 {{bug(957513)}} をご覧ください。 {{jsxref("parseInt", "parseInt()")}} についてのページもご覧ください。

##### 指数

10 進数の指数リテラルは、 `beN` の書式で指定します。ここで `b` は基数(整数または浮動小数点)、その後に `e` 文字(セパレーターまたは指数記号として機能)、そして `N`*指数*または*べき乗数* - 符号付き整数です(2019 ECMA-262 仕様に従います)。

```js
0e-5   // => 0
0e+5   // => 0
5e1    // => 50
175e-2 // => 1.75
1e3    // => 1000
1e-3   // => 0.001
```

#### 2 進数

2進数の構文は、先頭のゼロに続いて小文字または大文字のラテン文字 "B" を使用します (`0b` または `0B`)。この構文は ECMAScript 2015 の新しい構文なので、下記のブラウザー互換性表をご覧ください。 `0b` の後の数字が 0 または 1 でない場合は、 {{jsxref("SyntaxError")}} が "Missing binary digits after 0b" の内容で発生します。

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

#### 8 進数

8進数の構文は、先頭のゼロに続いて小文字または大文字のラテン文字 "O" を使用します (`0o` または `0O`)。この構文は ECMAScript 2015 の新しい構文なので、下記のブラウザー互換性表をご覧ください。 `0o` の後の数字が範囲 (01234567) 外の場合、 {{jsxref("SyntaxError")}} が "Missing octal digits after 0o" の内容で発生します。

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

// ゼロだけで始めることもできます (上記の10進数についてのメモを参照)
0755
0644
```

#### 16 進数

16 進数の構文は、先頭のゼロに続いて小文字または大文字のラテン文字 "X" を使用します (`0x` または `0X`)。 0x の後の数字が範囲 (0123456789ABCDEF) 外の場合、 {{jsxref("SyntaxError")}} が "Identifier starts immediately after numeric literal" の内容で発生します。

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

#### 長整数リテラル

[長整数型](/ja/docs/Web/JavaScript/Data_structures#長整数型_bigint) (BigInt) は JavaScript の数値プリミティブであり、自由な精度の整数を表すことができます。長整数リテラルは、整数の末尾に `n` を追加することで作成されます。

```js
123456789123456789n     // 123456789123456789
0o777777777777n         // 68719476735
0x123456789ABCDEFn      // 81985529216486895
0b11101001010101010101n // 955733
```

なお、先頭がゼロだけの 8 進数は `BigInt` では動作しません。

```js example-bad
// 0755n
// SyntaxError: invalid BigInt syntax
```

8 進数の `BigInt` 数値では、常にゼロの後に "o" (大文字でも小文字でも) を付けて使用してください。

```js example-good
0o755n
```

`BigInt` についての詳細な情報は、 [JavaScript のデータ構造](/ja/docs/Web/JavaScript/Data_structures#長整数型_bigint)をご覧ください。

#### 数値の区切り文字

数値リテラルの可読性を高めるために、アンダースコア (`_`, `U+005F`) を区切り文字として使用することができます。

```js
// 10 進数の区切り文字
1_000_000_000_000
1_050.95

// 2 進数の区切り文字
0b1010_0001_1000_0101

// 8 進数の区切り文字
0o2_2_5_6

// 16 進数の区切り文字
0xA0_B0_C0

// BigInt の区切り文字
1_000_000_000_000_000_000_000n
```

なお、以下の制限があります。

```js example-bad
// 連続して 2 つ以上のアンダースコアは許可されていません
100__000; // SyntaxError

// 数値リテラルの末尾に置くことは許可されていません
100_; // SyntaxError

// 先頭の 0 の後に使用することはできません
0_1; // SyntaxError
```

### オブジェクトリテラル

詳細については、 {{jsxref("Object")}} と[オブジェクト初期化子](/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer)をご覧ください。

```js
var o = { a: 'foo', b: 'bar', c: 42 };

// ES2015 で導入された短縮表記
var a = 'foo', b = 'bar', c = 42;
var o = {a, b, c};

// 以前の表記
var o = { a: a, b: b, c: c };
```

### 配列リテラル

詳細については {{jsxref("Array")}} をご覧ください。

```js
[1954, 1974, 1990, 2014]
```

### 文字列リテラル

[文字列](/ja/docs/Web/JavaScript/Data_structures#文字列型_string)リテラルは、単一引用符または二重引用符に囲まれた零個以上の Unicode コードポイントです。 Unicode コードポイントはエスケープシーケンスで表すこともできます。以下の引用符を閉じるコードポイントを除いて、すべてのコードポイントが文字列リテラルに現れることができます。

- U+005C \ (バックスラッシュ)
- U+000D \<CR>,
- and U+000A \<LF>.

[proposal to make all JSON text valid ECMA-262](https://github.com/tc39/proposal-json-superset) より以前は、 U+2028 \<LS> および U+2029 \<PS> は文字列リテラル内でエスケープせずに現れることができませんでした。

すべてのコードポイントが、エスケープシーケンスの形で現れることができます。文字列リテラルは ECMAScript の文字列値として評価されます。これらの文字列の値を生成する際に、 Unicode コードポイントは UTF-16 エンコードされます。

```js
'foo'
"bar"
```

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

16 進エスケープシーケンスは `\x` に続いてちょうど 2 桁の 16 進数から成り、 0x0000 から 0x00FF までのコード単位またはコードポイントを表します。

```js
'\xA9' // "©"
```

#### Unicode エスケープシーケンス

Unicode エスケープシーケンスは `\u` に続いてちょうど 4 桁の 16 進数から成ります。これで UTF-16 エンコーディングのコード単位を表します。コードポイント U+0000 から U+FFFF までは、コード単位とコードポイントは等しくなります。コードポイント U+10000 から U+10FFFF までは、 2 つのエスケープシーケンスで 2 つのコード単位 (サロゲートペア) を表す必要があります。サロゲートペアはコードポイントで区別されます。

See also {{jsxref("String.fromCharCode()")}} and {{jsxref("String.prototype.charCodeAt()")}}.

```js
'\u00A9' // "©" (U+A9)
```

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

Unicode コードポイントエスケープは `\u{` に続いて 16 進数のコードポイントが続き、 `}` が続きます。 16 進数の値は 0 から 0x10FFFF までの範囲に含まれている必要があります。 U+10000 から U+10FFFF までの範囲のコードポイントを、サロゲートペアとして表す必要はありません。コードポイントエスケープは JavaScript に ECMAScript 2015 (ES6) で追加されました。

{{jsxref("String.fromCodePoint()")}} または {{jsxref("String.prototype.codePointAt()")}} もご覧ください。

```js
'\u{2F804}' // CJK COMPATIBILITY IDEOGRAPH-2F804 (U+2F804)

// 同じ文字をサロゲートペアで表したもの
'\uD87E\uDC04'
```

### 正規表現リテラル

詳細については {{jsxref("RegExp")}} を参照してください。

```js
/ab+c/g

// 「空の」正規表現リテラル
// 単一行コメントと区別するために、空のキャプチャしない
// グループが必要です。
/(?:)/
```

### テンプレートリテラル

詳細について、[テンプレート文字列](/ja/docs/Web/JavaScript/Reference/Template_literals)をご覧ください。

```js
`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tag `string text ${expression} string text`
```

## 自動セミコロン挿入

一部の [JavaScript 文](/ja/docs/Web/JavaScript/Reference/Statements)はセミコロンで終わる必要があります。したがって、自動セミコロン挿入 (ASI) の影響を受けます。

- 空の文
- `let`, `const`, 変数定義
- `import`, `export`, モジュール宣言
- 式の文
- `debugger`
- `continue`, `break`, `throw`
- `return`

ECMAScript 仕様書は、[セミコロン挿入の 3 つの規則](https://tc39.github.io/ecma262/#sec-rules-of-automatic-semicolon-insertion)に言及しています。

1\. 文法上許されない位置で[行末文字](#行末文字)または "}" に遭遇したとき、セミコロンが前に挿入されます。

```js
{ 1
2 } 3

// 上記の文は、 ASI によって次のように変換されます

{ 1
;2 ;} 3;
```

2\. トークンの入力ストリームの末尾が検出され、パーサーが単一の入力ストリームを完全なプログラムとして解釈できない場合、末尾にセミコロンが挿入されます。

ここで `++` は、変数 `b` に適用される[後置演算子](/ja/docs/Web/JavaScript/Reference/Operators#インクリメントとデクリメント)としては扱われません。というのも、行末文字が `b``++` の間に見られるからです。

```js
a = b
++c

// 上記の文は、 ASI によって次のように変換されます

a = b;
++c;
```

3\. 文法上の制限付き生成物を含む文の後に行末文字が続いている場合、最後にセミコロンが挿入されます。以下の文が "no LineTerminator here" 規則を持っています。

- 後置演算子 (`++` および `--`)
- `continue`
- `break`
- `return`
- `yield`, `yield*`
- `module`

```js
return
a + b

// 上記の文は、 ASI によって次のように変換されます

return;
a + b;
```

## ブラウザーの互換性

{{Compat}}

## 関連情報

- [Lexical grammar in the ECMAScript specification](https://tc39.es/ecma262/#sec-ecmascript-language-lexical-grammar)
- [Jeff Walden: Binary and octal numbers](https://whereswalden.com/2013/08/12/micro-feature-from-es6-now-in-firefox-aurora-and-nightly-binary-and-octal-numbers/)
- [Mathias Bynens: JavaScript character escape sequences](https://mathiasbynens.be/notes/javascript-escapes)
- [論理型](/ja/docs/Web/JavaScript/Data_structures#論理型_boolean)
- [数値型](/ja/docs/Web/JavaScript/Data_structures#数値型_number)
- [文字列型](/ja/docs/Web/JavaScript/Data_structures#文字列型_string)
- {{jsxref("RegExp")}}