Автоматическая вставка точки с запятой в JavaScript (ASI)

Большинство операторов и объявлений JavaScript (ECMAScript) должны заканчиваться точкой с запятой. Такие точки с запятой всегда могут явно присутствовать в исходном тексте. Для удобства, однако, такие точки с запятой могут быть опущены из исходного текста в определенных ситуациях. При этом в таких ситуациях точки с запятой автоматически вставляются в поток маркеров исходного кода с помощью механизма Automatic Semicolon Insertion (ASI).

Правила автоматической вставки точки с запятой

Оригинал

Исходный текст ECMAScript (скрипт или модуль) сначала преобразуется в последовательность входных элементов (токенов), которые являются маркерами, разделителями строк, комментариями или пробелами. Исходный текст сканируется слева направо, при этом в качестве следующего входного элемента берется максимально длинная последовательность кодовых точек. В приведенных ниже правилах “токен” означает фактический распознанный лексический токен, определенный с использованием текущего лексического символа. 

Использование нескольких лексических целей гарантирует отсутствие лексических двусмысленностей, которые могли бы повлиять на автоматическую вставку точки с запятой. 

Пример

Например, не существует синтаксических грамматических контекстов, где одновременно разрешены деление (или деление-присвоение) и регулярное выражение (RegularExpressionLiteral). 

В таких примерах, как :

где первая точка кода без пробелов, без комментариев после разделителя строки "косая черта" U+002F (SOLIDUS) и синтаксический контекст допускает деление или присвоение деления, точка с запятой автоматически не вставляется. То есть приведенный выше пример интерпретируется так же, как:

[свернуть]

Основные правила вставки точки с запятой в JS:

  1. Когда при анализе слева направо скрипта или модуля встречается токен (в дословном переводе называемый оскорбляющим токеном, но далее буду называть его препятствующим токеном), который не разрешен никакими правилами грамматики, то точка с запятой автоматически вставляется перед препятствующим токеном, если выполняется одно или несколько из следующих условий:
    • препятствующий токен отделяется от предыдущего токена по крайней мере одним переводом строки (LineTerminator, см. ниже);
    • препятствующий токен является закрывающей фигурной скобкой };
    • предыдущий токен является закрывающей круглой скобкой ), и вставленная точка с запятой будет затем проанализирована как завершающая точка с запятой оператора do...while (13.7.2).
  2. Когда при анализе слева направо скрипта или модуля обнаруживается конец входного потока токенов, и парсер не может разобрать входной поток токенов как единый полный (законченный) ECMAScript скрипт или модуль, то точка с запятой автоматически вставляется в конце входного потока.
  3. Когда при анализе слева направо скрипта или модуля встречается токен, который разрешен грамматикой, но с ограничениями (и поэтому такой токен называется ограниченным токеном), и ограниченный токен отделен от предыдущего токена по крайней мере одним переводом строки (LineTerminator, см. ниже).

Примеры 1-го и 2-го правила вставки точки с запятой в JS:

Пример 1

станет

Пример 2

станет

Примеры 3-го правила вставки точки с запятой в JS:

UpdateExpression :

  • LeftHandSideExpression [нет LineTerminator] ++
  • LeftHandSideExpression [нет LineTerminator] --

ContinueStatement :

  • continue ;
  • continue [нет LineTerminator] LabelIdentifier ;

BreakStatement :

  • break ;
  • break [нет LineTerminator] LabelIdentifier ;

ReturnStatement :

  • return ;
  • return [нет LineTerminator] Expression ;

ThrowStatement :

  • throw [нет LineTerminator] Expression ;

ArrowFunction :

  • ArrowParameters [нет LineTerminator] => ConciseBody

YieldExpression :

yield [нет LineTerminator] * AssignmentExpression

yield [нет LineTerminator] AssignmentExpression

Когда встречается токен ++ или -- в тех местах, где синтаксический анализатор рассматривал бы его как постфиксный оператор, и имеется по крайней мере один LineTerminator между предыдущим токеном и токеном ++ или --, то точка с запятой автоматически вставляется перед токеном ++ или --.

При обнаружении токена continue, break, return, throw или yield и переводе строки перед следующим токеном автоматически вставляется точка с запятой (после токена continue, break, return, throw или yield).

Пример

Например, 

будет преобразовано в

[свернуть]

Практические рекомендации программистам:

  1. Постфиксный оператор ++ или -- должен находиться в той же строке, что и его операнд.
  2. Выражение в операторе return или throw или выражение присваивания в выражении yield должно начинаться с той же строки, что и токен return, throw или yield.
  3. Идентификатор метки в операторе break или continue должен находиться в той же строке, что и маркер break или continue.

Точку с запятой в коде можно не ставить только в том случае, если ваш код кроме вас никто никогда в жизни не увидит. Если есть хоть малейший шанс обратного, то вопросов быть не должно: точка с запятой ставится обязательно — это будет просто правильное единообразное использование JavaScript.

Перевод строк (LineTerminator)

Кодовые точки разделения (окончания) строки ECMAScript перечислены в таблице:

Code Point Unicode Name Abbreviation
U+000A

LINE FEED (LF)

(подача строки)

<LF>
U+000D

CARRIAGE RETURN (CR)

(возврат каретки)

<CR>
U+2028

LINE SEPARATOR

(разделитель строк)

<LS>
U+2029

PARAGRAPH SEPARATOR

(разделитель абзацев)

<PS>

По стандарту, любое совместимое с Юникодом приложение должно воспринимать как перевод строки каждый из нижеследующих символов:

LF (U+000A): англ. line feed — подача строки <LF>;
CR (U+000D): англ. carriage return — возврат каретки <CR>;
LS (U+2028): англ. line separator — разделитель строк <LS>;
PS (U+2029): англ. paragraph separator — разделитель абзацев <PS>.
Последовательность CR+LF (U+000D U+000A) надлежит воспринимать как один перевод строки, а не два.

[свернуть]

2 комментария к “Автоматическая вставка точки с запятой в JavaScript (ASI)”

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.