aboutsummaryrefslogtreecommitdiff
path: root/files/uk/web/javascript/reference/lexical_grammar/index.html
blob: c9a63ab9da75d7ef159d242a5cd7680b8d3e3596 (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
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
---
title: Лексична граматика
slug: Web/JavaScript/Reference/Lexical_grammar
tags:
  - JavaScript
  - Посібник
  - ключове слово
  - лексична граматика
  - літерал
translation_of: Web/JavaScript/Reference/Lexical_grammar
---
<div>{{JsSidebar("More")}}</div>

<p>Ця стаття описує лексичну граматику JavaScript. Текст коду скриптів ECMAScript сканується зліва направо та перетворюється на послідовність вхідних елементів, якими є токени, керівні символи, символи розриву рядка, коментарі або <a href="/uk/docs/Glossary/whitespace">пробільні символи</a>. ECMAScript також визначає певні ключові слова та має правила для автоматичної вставки крапки з комою для завершення інструкцій.</p>

<h2 id="Керівні_символи">Керівні символи</h2>

<p>Керівні символи не мають візуального відображення, але використовуються для керування інтерпретацією тексту.</p>

<table class="standard-table">
 <caption>Керівні символи Юнікоду</caption>
 <thead>
  <tr>
   <th>Код символа</th>
   <th>Назва</th>
   <th>Скорочення</th>
   <th>Опис</th>
  </tr>
 </thead>
 <thead>
  <tr>
   <td><code>U+200C</code></td>
   <td>Роз'єднувач нульової ширини<br>
    (Zero width non-joiner)</td>
   <td>&lt;ZWNJ&gt;</td>
   <td>Розташовується між символами, щоб запобігти об'єднанню їх у лігатури у певних мовах (<a href="https://en.wikipedia.org/wiki/Zero-width_non-joiner">Вікіпедія</a>).</td>
  </tr>
  <tr>
   <td><code>U+200D</code></td>
   <td>Об'єднувач нульової ширини<br>
    (Zero width joiner)</td>
   <td>&lt;ZWJ&gt;</td>
   <td>Розташовується між символами, які інакше не були б об'єднані, щоб відобразити символи у їхній об'єднаній формі у певних мовах (<a href="https://en.wikipedia.org/wiki/Zero-width_joiner">Вікіпедія</a>).</td>
  </tr>
  <tr>
   <td><code>U+FEFF</code></td>
   <td>Маркер порядку байтів<br>
    (Byte order mark)</td>
   <td>&lt;BOM&gt;</td>
   <td>Використовується на початку скрипта, щоб позначити його як Юнікод, та для позначення порядку байтів (<a href="https://uk.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%80_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D1%83_%D0%B1%D0%B0%D0%B9%D1%82%D1%96%D0%B2">Вікіпедія</a>).</td>
  </tr>
 </thead>
</table>

<h2 id="Пробільні_символи">Пробільні символи</h2>

<p><a href="/uk/docs/Glossary/whitespace">Пробільні символи</a> покращують читабельність тексту коду та відділяють токени один від одного. Ці символи зазвичай не є обов'язковими для функціональності коду. Часто використовують <a href="https://en.wikipedia.org/wiki/Minification_%28programming%29">інструменти мініфікації</a> для прибирання пробільних символів, щоб зменшити кількість даних, які необхідно передати.</p>

<table class="standard-table">
 <caption>Пробільні символи</caption>
 <thead>
  <tr>
   <th>Код символа</th>
   <th>Назва</th>
   <th>Скорочення</th>
   <th>Опис</th>
   <th>Екранована послідовність</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>U+0009</td>
   <td>Табуляція символа<br>
    (Character tabulation)</td>
   <td>&lt;HT&gt;</td>
   <td>Горизонтальна табуляція</td>
   <td>\t</td>
  </tr>
  <tr>
   <td>U+000B</td>
   <td>Табуляція рядка<br>
    (Line tabulation)</td>
   <td>&lt;VT&gt;</td>
   <td>Вертикальна табуляція</td>
   <td>\v</td>
  </tr>
  <tr>
   <td>U+000C</td>
   <td>Зміна сторінки<br>
    (Form feed)</td>
   <td>&lt;FF&gt;</td>
   <td>Керівний символ розриву сторінки (<a href="https://en.wikipedia.org/wiki/Page_break#Form_feed">Вікіпедія</a>).</td>
   <td>\f</td>
  </tr>
  <tr>
   <td>U+0020</td>
   <td>Пробіл<br>
    (Space)</td>
   <td>&lt;SP&gt;</td>
   <td>Звичайний пробіл</td>
   <td></td>
  </tr>
  <tr>
   <td>U+00A0</td>
   <td>Нерозривний пробіл<br>
    (No-break space)</td>
   <td>&lt;NBSP&gt;</td>
   <td>Звичайний пробіл, але відсутня позиція, де можливий розрив рядка</td>
   <td></td>
  </tr>
  <tr>
   <td>Інші</td>
   <td>Інші пробільні символи Юнікоду</td>
   <td>&lt;USP&gt;</td>
   <td><a href="https://uk.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B1%D1%96%D0%BB">Пробіли Юнікоду на Вікіпедії</a></td>
   <td></td>
  </tr>
 </tbody>
</table>

<h2 id="Символи_розриву_рядка">Символи розриву рядка</h2>

<p>На додачу до <a href="/en-US/docs/Glossary/Whitespace">пробільних</a> символів, символи розриву рядка використовуються для покращення читабельності тексту коду. Однак, у деяких випадках символи розриву рядка можуть вплинути на виконання коду JavaScript, оскільки існують декілька місць, де вони заборонені. Символи розриву рядка також впливають на процес <a href="#Автоматична_вставка_крапки_з_комою">автоматичної вставки крапки з комою</a>. Символи розриву рядка відповідають класу <strong>\s</strong> у <a href="/uk/docs/Web/JavaScript/Guide/Regular_Expressions">регулярних виразах</a>.</p>

<p>Лише наступні коди символів Юнікоду сприймаються як символи розриву рядка у ECMAScript, інші символи розриву сприймаються як пробільні (наприклад, символ Наступний рядок (Next Line), NEL, U+0085 вважається пробільним символом).</p>

<table class="standard-table">
 <caption>Символи розриву рядка</caption>
 <thead>
  <tr>
   <th>Код символа</th>
   <th>Назва</th>
   <th>Скорочення</th>
   <th>Опис</th>
   <th>Екранована послідовність</th>
  </tr>
 </thead>
 <thead>
 </thead>
 <tbody>
  <tr>
   <td>U+000A</td>
   <td>Зміна рядка<br>
    (Line Feed)</td>
   <td>&lt;LF&gt;</td>
   <td>Символ нового рядка в системах UNIX.</td>
   <td>\n</td>
  </tr>
  <tr>
   <td>U+000D</td>
   <td>Повернення каретки<br>
    (Carriage Return)</td>
   <td>&lt;CR&gt;</td>
   <td>Символ нового рядка у Commodore та ранній системі Mac.</td>
   <td>\r</td>
  </tr>
  <tr>
   <td>U+2028</td>
   <td>Роздільник рядків<br>
    (Line Separator)</td>
   <td>&lt;LS&gt;</td>
   <td><a href="https://uk.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D1%80%D1%8F%D0%B4%D0%BA%D0%B0">Вікіпедія</a></td>
   <td></td>
  </tr>
  <tr>
   <td>U+2029</td>
   <td>Роздільник абзаців<br>
    (Paragraph Separator)</td>
   <td>&lt;PS&gt;</td>
   <td><a href="https://uk.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D1%80%D1%8F%D0%B4%D0%BA%D0%B0">Вікіпедія</a></td>
   <td></td>
  </tr>
 </tbody>
</table>

<h2 id="Коментарі">Коментарі</h2>

<p>Коментарі використовуються для додавання приміток, зауваг, пропозицій чи застережень до коду JavaScript. Це робить код легшим для читання та розуміння. Їх також можна використовувати для відключення коду, щоб запобігти його виконанню; це може бути цінним інструментом відлагодження.</p>

<p>JavaScript має два давніх способи додавання коментарів у код.</p>

<p>Перший - це коментарі <code>//</code><strong>;</strong> він перетворює весь текст, що розташований за ним, на коментар. Наприклад:</p>

<pre class="brush: js notranslate">function comment() {
  // Це однорядковий коментар JavaScript
  console.log('Всім привіт!');
}
comment();
</pre>

<p>Другий спосіб - це стиль <code>/* */</code>, він набагато гнучкіший.</p>

<p>Наприклад, ви можете використати його на одному єдиному рядку:</p>

<pre class="brush: js notranslate">function comment() {
  /* Це однорядковий коментар JavaScript */
  console.log('Всім привіт!');
}
comment();</pre>

<p>Ви також можете створювати багаторядкові коментарі, ось так:</p>

<pre class="brush: js notranslate">function comment() {
  /* Цей коментар містить декілька рядків. Зауважте,
     що коментар не потрібно завершувати, поки ми не закінчили. */
  console.log('Всім привіт!');
}
comment();</pre>

<p>Ви також можете за бажанням використати його всередині рядка, хоча це може зробити ваш код важчим для читання, тому його варто використовувати з обережністю:</p>

<pre class="brush: js notranslate">function comment(x) {
  console.log('Всім ' + x /* вставити значення x */ + ' !');
}
comment('привіт');</pre>

<p>На додачу, ви можете відключити код, щоб уникнути його виконання, огорнувши код ось так:</p>

<pre class="brush: js notranslate">function comment() {
  /* console.log('Всім привіт!'); */
}
comment();</pre>

<p>У цьому випадку виклик <code>console.log()</code> не виконується, оскільки знаходиться всередині коментаря. Таким чином можна відключити будь-яку кількість рядків коду.</p>

<h2 id="Коментарі_шебанг">Коментарі шебанг</h2>

<p>Спеціалізований третій синтаксис коментарів, <strong>коментар шебанг</strong>, знаходиться в процесі стандартизації у ECMAScript (дивіться <a href="https://github.com/tc39/proposal-hashbang">Hashbang Grammar proposal</a>).</p>

<p>Коментар шебанг поводиться так само, як однорядковий коментар (<code>//</code>). Але він починається з позначки <code>#!</code> та <strong>дозволений лише на самому початку тексту скрипта</strong>. Також зауважте, що перед позначкою <code>#!</code> не можна ставити жодних пробільних знаків. Коментар складається з усіх символів, що стоять після <code>#!</code> до самого кінця першого рядка; дозволений лише один такий коментар.</p>

<p>Коментар шебанг визначає шлях до специфічного інтерпретатора JavaScript, який ви бажаєте використати для виконання скрипта. Приклад виглядає наступним чином:</p>

<pre class="brush: js notranslate">#!/usr/bin/env node

console.log("Всім привіт");
</pre>

<div class="blockIndicator note">
<p><strong>Заувага</strong>: Коментарі шебанг у JavaScript імітують <a href="https://uk.wikipedia.org/wiki/%D0%A8%D0%B5%D0%B1%D0%B0%D0%BD%D0%B3_(Unix)">шебанги в Unix</a>, що використовуються для запуску файлів з відповідним інтерпретатором.</p>
</div>

<div class="blockIndicator warning">
<p>Хоча символ <a href="https://uk.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%80_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D1%83_%D0%B1%D0%B0%D0%B9%D1%82%D1%96%D0%B2">BOM</a> перед коментарем шебанг працює у переглядачі, його не радять використовувати у скрипті з шебангом. BOM не працюватиме, якщо ви намагаєтесь виконати скрипт у Unix/Linux. Тому використовуйте UTF-8 без символа BOM, якщо ви хочете виконувати скрипти безпосередньо з оболонки.</p>
</div>

<p>Стиль коментарів <code>#!</code> має використовуватись тільки для того, щоб вказати інтерпретатор JavaScript. У всіх інших випадках просто ставте коментар <code>//</code> (чи багаторядковий коментар).</p>

<h2 id="Ключові_слова">Ключові слова</h2>

<h3 id="Зарезервовані_ключові_слова_у_ECMAScript_2015">Зарезервовані ключові слова у ECMAScript 2015</h3>

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

<h3 id="Ключові_слова_зарезервовані_на_майбутнє">Ключові слова, зарезервовані на майбутнє</h3>

<p>Наступні слова зарезервовані як ключові слова специфікацією ECMAScript. Наразі вони не мають спеціальної функціональності, але невдовзі, можливо, матимуть, тому їх не можна використовувати в якості ідентифікаторів.</p>

<p>Наступні слова завжди зарезервовані:</p>

<ul>
 <li><code>enum</code></li>
</ul>

<p>Наступні слова є зарезервованими лише у строгому режимі:</p>

<ul class="threecolumns">
 <li><code>implements</code></li>
 <li><code>interface</code></li>
 <li>{{jsxref("Statements/let", "let")}}</li>
 <li><code>package</code></li>
 <li><code>private</code></li>
 <li><code>protected</code></li>
 <li><code>public</code></li>
 <li><code>static</code></li>
</ul>

<p>Наступні є зарезервованими лише у коді модулів:</p>

<ul>
 <li><code>await</code></li>
</ul>

<h4 id="Ключові_слова_зарезервовані_на_майбутнє_у_старших_стандартах">Ключові слова, зарезервовані на майбутнє у старших стандартах</h4>

<p>Далі наведено ключові слова, зарезервовані на майбутнє старшими специфікаціями ECMAScript (ECMAScript від 1 до 3).</p>

<ul class="threecolumns">
 <li><code>abstract</code></li>
 <li><code>boolean</code></li>
 <li><code>byte</code></li>
 <li><code>char</code></li>
 <li><code>double</code></li>
 <li><code>final</code></li>
 <li><code>float</code></li>
 <li><code>goto</code></li>
 <li><code>int</code></li>
 <li><code>long</code></li>
 <li><code>native</code></li>
 <li><code>short</code></li>
 <li><code>synchronized</code></li>
 <li><code>throws</code></li>
 <li><code>transient</code></li>
 <li><code>volatile</code></li>
</ul>

<p>Крім того, літерали <code>null</code>, <code>true</code> та <code>false</code> не можна використовувати в якості ідентифікаторів у ECMAScript.</p>

<h3 id="Використання_зарезервованого_слова">Використання зарезервованого слова</h3>

<p>Зарезервовані слова, насправді, стосуються лише <em>ідентифікаторів</em> (на противагу<em> іменам ідентифікаторів</em>). Як описано у <a href="http://es5.github.com/#A.1">es5.github.com/#A.1</a>, це усі <em>імена ідентифікаторів</em>, які не включають <em>зарезервовані слова</em>.</p>

<pre class="brush: js notranslate">a.import
a['import']
a = { import: 'test' }.
</pre>

<p>З іншого боку, наступний код є некоректним, тому що це <em>ідентифікатор</em>, ними є <em>імена ідентифікаторів</em> без зарезервованих слів. Ідентифікатори використовуються для <em>оголошення функцій</em>, <em>функціональних виразів</em>,<em> оголошення змінних</em> і т.д. <em>Імена ідентифікаторів</em> використовуються для<em> виразу елемента (MemberExpression)</em>,<em> виразу виклику (CallExpression)</em> і т.д.</p>

<pre class="brush: js notranslate">function import() {} // некоректно.</pre>

<h3 id="Ідентифікатори_зі_спеціальними_значеннями">Ідентифікатори зі спеціальними значеннями</h3>

<p>Декілька ідентифікаторів мають спеціальні значення у певному контексті, не будучи ключовими словами жодного виду. Ними є:</p>

<ul class="threecolumns">
 <li>{{jsxref("Functions/arguments", "arguments")}}</li>
 <li>{{jsxref("Functions/get", "get")}}</li>
 <li>{{jsxref("Functions/set", "set")}}</li>
</ul>

<h2 id="Літерали">Літерали</h2>

<h3 id="Літерал_null">Літерал null</h3>

<p>Додаткову інформацію дивіться також у {{jsxref("null")}}.</p>

<pre class="brush: js notranslate">null</pre>

<h3 id="Булевий_літерал">Булевий літерал</h3>

<p>Дивіться також додаткову інформацію у {{jsxref("Boolean")}}.</p>

<pre class="brush: js notranslate">true
false</pre>

<h3 id="Числові_літерали">Числові літерали</h3>

<p>Типи {{jsxref("Число","Number")}} та {{jsxref("BigInt")}} використовують числові літерали.</p>

<h4 id="Десятковий">Десятковий</h4>

<pre class="brush: js notranslate">1234567890
42

// Будьте обережні при використанні нуля попереду
0888 // 888 розбирається як десяткове
0777 // розбирається як вісімкове, 511 у десятковій системі
</pre>

<p>Зауважте, що десяткові літерали можуть починатися з нуля (<code>0</code>), за яким іде інша десяткова цифра, але, якщо усі цифри після <code>0</code> менші за 8, число інтерпретується як вісімкове. Це не спричинить викидання помилки у JavaScript, дивіться <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=957513">помилку 957513</a>. Також дивіться статтю щодо {{jsxref("parseInt", "parseInt()")}}</p>

<h5 id="Експоненціальний">Експоненціальний</h5>

<p>Десятковий експоненціальний літерал позначається наступним форматом: <code>beN</code>; де <code>b</code> - мантиса (число, ціле чи з рухомою комою), далі символ <code>e</code> (який слугує роздільником, або <em>експоненціальним показником</em>) та<em> </em><code>N</code>, яке вказує <em>порядок</em> – ціле число зі знаком (згідно з 2019 ECMA-262): </p>

<pre class="brush: js notranslate">0e-5   // =&gt; 0
0e+5   // =&gt; 0
5e1    // =&gt; 50
175e-2 // =&gt; 1.75
1e3    // =&gt; 1000
1e-3   // =&gt; 0.001
</pre>

<h4 id="Двійковий">Двійковий</h4>

<p>Синтаксис двійкових чисел використовує нуль на початку, за яким іде латинська літера "B", маленька чи велика (<code>0b</code> або <code>0B</code>). Оскільки цей синтаксис новий у ECMAScript 2015, дивіться таблицю сумісності з веб-переглядачами, наведену нижче. Якщо цифри після <code>0b</code> не є 0 чи 1, викидається наступна помилка {{jsxref("SyntaxError")}}: "Missing binary digits after 0b".</p>

<pre class="brush: js notranslate">var FLT_SIGNBIT  = 0b10000000000000000000000000000000; // 2147483648
var FLT_EXPONENT = 0b01111111100000000000000000000000; // 2139095040
var FLT_MANTISSA = 0B00000000011111111111111111111111; // 8388607</pre>

<h4 id="Вісімковий">Вісімковий</h4>

<p>Синтаксис вісімкових чисел використовує нуль на початку, за яким іде латинська літера "O", маленька чи велика (<code>0o</code> або <code>0O)</code>. Оскільки цей синтаксис новий у ECMAScript 2015, дивіться таблицю сумісності з веб-переглядачами, наведену нижче. Якщо цифри після <code>0o</code> виходять за межі діапазону (01234567), викидається наступна помилка {{jsxref("SyntaxError")}}: "Missing octal digits after 0o".</p>

<pre class="brush: js notranslate">var n = 0O755; // 493
var m = 0o644; // 420

// Також можна просто через нуль на початку
// (дивіться заувагу щодо десяткових чисел вище)
0755
0644
</pre>

<h4 id="Шістнадцятковий">Шістнадцятковий</h4>

<p>Синтаксис шістнадцяткових чисел використовує нуль на початку, за яким іде латинська літера "X", велика чи маленька (<code>0x</code> або <code>0X</code>). Якщо цифри після 0x виходять за межі діапазону (0123456789ABCDEF), викидається наступна помилка {{jsxref("SyntaxError")}}: "Identifier starts immediately after numeric literal".</p>

<pre class="brush: js notranslate">0xFFFFFFFFFFFFFFFFF // 295147905179352830000
0x123456789ABCDEF   // 81985529216486900
0XA                 // 10
</pre>

<h4 id="Літерал_BigInt">Літерал BigInt</h4>

<p>Тип {{jsxref("BigInt")}} є числовим простим типом у JavaScript, який може представляти цілі числа з довільною точністю. Літерали BigInt створюються додаванням <code>n</code> в кінець цілого числа.</p>

<pre class="brush: js notranslate">123456789123456789n     // 123456789123456789
0o777777777777n         // 68719476735
0x123456789ABCDEFn      // 81985529216486895‬
0b11101001010101010101n // 955733
</pre>

<p>Зауважте, що старі вісімкові числа з просто нулем на початку не працюватимуть з <code>BigInt</code>:</p>

<pre class="brush: js example-bad notranslate">// 0755n
// SyntaxError: invalid BigInt syntax</pre>

<p>Для вісімкових чисел <code>BigInt</code> завжди використовуйте нуль з літерою "o" (великою чи маленькою):</p>

<pre class="brush: js example-good notranslate">0o755n</pre>

<p>Більше інформації щодо <code>BigInt</code> дивіться у статті <a href="/uk/docs/Web/JavaScript/Data_structures#Тип_BigInt">Структури даних JavaScript</a>.</p>

<h4 id="Числові_роздільники">Числові роздільники</h4>

<p>Щоб покращити читабельність числових літералів, можна використовувати підкреслення (<code>_</code>, <code>U+005F</code>) в якості роздільників:</p>

<pre class="brush: js notranslate">// роздільники у десяткових числах
1_000_000_000_000
1_050.95

// роздільники у двійкових числах
0b1010_0001_1000_0101

// роздільники у вісімкових числах
0o2_2_5_6

// роздільники у шістнадцяткових числах
0xA0_B0_C0

// роздільники у BigInt
1_000_000_000_000_000_000_000n
</pre>

<p>Зверніть увагу на ці обмеження:</p>

<pre class="brush: js example-bad notranslate">// Не можна ставити більше одного підкреслення підряд
100__000; // SyntaxError

// Не можна ставити в кінці числового літерала
100_; // SyntaxError

// Не можна використовувати після нуля на початку 0
0_1; // SyntaxError
</pre>

<h3 id="Обєктні_літерали">Об'єктні літерали</h3>

<p>Більше інформації дивіться також на сторінках {{jsxref("Object")}} та <a href="/uk/docs/Web/JavaScript/Reference/Operators/Ініціалізація_об’єктів">Ініціалізатор об'єкта</a>.</p>

<pre class="brush: js notranslate">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 };
</pre>

<h3 id="Масивні_літерали">Масивні літерали</h3>

<p>Більше інформації дивіться також у {{jsxref("Array")}}.</p>

<pre class="brush: js notranslate">[1954, 1974, 1990, 2014]</pre>

<h3 id="Рядкові_літерали">Рядкові літерали</h3>

<p>Рядковий літерал - це нуль чи більше кодів символів Юнікоду всередині одинарних або подвійних лапок. Коди символів Юнікоду також можуть бути представлені екранованими послідовностями. Усі коди символів можуть з'являтись безпосередньо у рядковому літералі, окрім цих закриваючих кодів символів:</p>

<ul>
 <li>U+005C \ (зворотній слеш),</li>
 <li>U+000D &lt;CR&gt;</li>
 <li>та U+000A &lt;LF&gt;.</li>
</ul>

<p>До появи <a href="https://github.com/tc39/proposal-json-superset">пропозиції зробити весь текст формату JSON дозволеним у ECMA-262</a>, неекрановані U+2028 &lt;LS&gt; та U+2029 &lt;PS&gt; також були заборонені у рядкових літералах.</p>

<p>Будь-які коди символів можуть з'являтись у вигляді екранованої послідовності. Рядкові літерали повертають значення ECMAScript String. Під час генерування цих значень String коди символів Юнікоду кодуються форматом UTF-16.</p>

<pre class="brush: js notranslate">'foo'
"bar"</pre>

<h4 id="Шістнадцяткові_екрановані_послідовності">Шістнадцяткові екрановані послідовності</h4>

<p>Шістнадцяткові екрановані послідовності складаються з <code>\x</code> та рівно двох шістнадцяткових символів, що відображають кодову одиницю чи код символа у діапазоні від 0x0000 до 0x00FF.</p>

<pre class="brush: js notranslate">'\xA9' // "©"
</pre>

<h4 id="Екрановані_послідовності_Юнікоду">Екрановані послідовності Юнікоду</h4>

<p>Екранована послідовність Юнікоду складається рівно з чотирьох шістнадцяткових символів, записаних після <code>\u</code>. Вона відображає кодову одиницю у кодуванні UTF-16. Для кодів символів від U+0000 до U+FFFF кодова одиниця дорівнює коду символа. Коди символів від U+10000 до U+10FFFF потребують двох екранованих послідовностей, які відображають дві кодові одиниці (сурогатну пару), що використовуються для кодування символа; сурогатна пара відрізняється від коду символа.</p>

<p>Дивіться також {{jsxref("String.fromCharCode()")}} та {{jsxref("String.prototype.charCodeAt()")}}.</p>

<pre class="brush: js notranslate">'\u00A9' // "©" (U+A9)</pre>

<h4 id="Екранування_кодів_символів_Юнікоду">Екранування кодів символів Юнікоду</h4>

<p>Екранування коду символа Юнікоду складається з <code>\u{</code>, далі код символа у шістнадцятковому форматі, за ним <code>}</code>. Значення шістнадцяткових символів має знаходитись в діапазоні між 0 та 0x10FFFF включно. Коди символів у діапазоні від U+10000 до U+10FFFF не потребують представлення у вигляді сурогатної пари. Екранування кодів символів було додане у JavaScript у ECMAScript 2015 (ES6).</p>

<p>Дивіться також {{jsxref("String.fromCodePoint()")}} та {{jsxref("String.prototype.codePointAt()")}}.</p>

<pre class="brush: js notranslate">'\u{2F804}' // CJK COMPATIBILITY IDEOGRAPH-2F804 (U+2F804)

// той самий символ у вигляді сурогатної пари
'\uD87E\uDC04'</pre>

<h3 id="Літерал_регулярного_виразу">Літерал регулярного виразу</h3>

<p>Більше інформації дивіться також у {{jsxref("RegExp")}}.</p>

<pre class="brush: js notranslate">/ab+c/g

// Літерал "порожнього" регулярного виразу
// Порожня група необхідна,
// щоб уникнути неоднозначності щодо однорядкових коментарів.
/(?:)/</pre>

<h3 id="Шаблонні_літерали">Шаблонні літерали</h3>

<p>Дивіться також <a href="/uk/docs/Web/JavaScript/Reference/Template_literals">шаблонні рядки</a>.</p>

<pre class="brush: js notranslate">`текстовий рядок`

`текстовий рядок 1
 текстовий рядок 2`

`текст ${вираз} текст`

тег `текст ${вираз} текст`</pre>

<h2 id="Автоматична_вставка_крапки_з_комою">Автоматична вставка крапки з комою</h2>

<p>Деякі <a href="/uk/docs/Web/JavaScript/Reference/Statements">інструкції JavaScript</a> повинні завершуватись крапкою з комою, і тому підпадають під автоматичну вставку крапки з комою (ASI, automatic semicolon insertion):</p>

<ul>
 <li>Порожній оператор</li>
 <li><code>let</code>, <code>const</code>, інструкція змінної</li>
 <li><code>import</code>, <code>export</code>, оголошення модуля</li>
 <li>Інструкція виразу</li>
 <li><code>debugger</code></li>
 <li><code>continue</code>, <code>break</code>, <code>throw</code></li>
 <li><code>return</code></li>
</ul>

<p>Специфікація ECMAScript визначає <a href="https://tc39.github.io/ecma262/#sec-rules-of-automatic-semicolon-insertion">три правила вставки крапки з комою</a>.</p>

<p>1. Крапка з комою вставляється перед, коли <a href="#Символи_розриву_рядка">символ розриву рядка</a> чи "}" вважається таким, що недозволений за синтаксисом.</p>

<pre class="brush: js notranslate">{ 1 2 } 3

// перетворюється на

{ 1 2 ;} 3;</pre>

<p>2. Крапка з комою вставляється в кінці, коли виявлено кінець вхідного набору токенів, але синтаксичний аналізатор неспроможний розібрати єдиний вхідний набір як завершену програму.</p>

<p>Тут <code>++</code> не сприймається як <a href="/uk/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Increment">постфіксний оператор</a>, що застосовується до змінної <code>b</code>, тому що між <code>b</code> та <code>++</code> знаходиться символ розриву рядка.</p>

<pre class="brush: js notranslate">a = b
++c

// перетворюється на

a = b;
++c;
</pre>

<p>3. Крапка з комою вставляється в кінці, коли інструкція з обмеженими граматичними застосуваннями супроводжується символом розриву рядка. Ці інструкції з правилом "жодних розривів рядка в цьому місці" наступні:</p>

<ul>
 <li>Постфіксні вирази (<code>++</code> та <code>--</code>)</li>
 <li><code>continue</code></li>
 <li><code>break</code></li>
 <li><code>return</code></li>
 <li><code>yield</code>, <code>yield*</code></li>
 <li><code>module</code></li>
</ul>

<pre class="brush: js notranslate">return
a + b

// перетворюється на

return;
a + b;
</pre>

<h2 id="Специфікації">Специфікації</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">Специфікація</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-ecmascript-language-lexical-grammar', 'Lexical Grammar')}}</td>
  </tr>
 </tbody>
</table>

<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2>



<p>{{Compat("javascript.grammar")}}</p>

<h2 id="Див._також">Див. також</h2>

<ul>
 <li><a href="http://whereswalden.com/2013/08/12/micro-feature-from-es6-now-in-firefox-aurora-and-nightly-binary-and-octal-numbers/">Jeff Walden: Двійкові та вісімкові числа</a></li>
 <li><a href="http://mathiasbynens.be/notes/javascript-escapes">Mathias Bynens: екрановані послідовності символів JavaScript</a></li>
 <li>{{jsxref("Boolean")}}</li>
 <li>{{jsxref("Число", "Number")}}</li>
 <li>{{jsxref("RegExp")}}</li>
 <li>{{jsxref("String")}}</li>
</ul>