ECMAScript | Имена и Ключевые Слова

ECMAScript | Имена и Ключевые Слова

IdentifierName (Идентификационное имя) и ReservedWord (Зарезервированное слово) — это токены, которые интерпретируются в соответствии с синтаксисом идентификатора по умолчанию, приведенным в приложении № 31 к стандарту Unicode, «Синтаксис идентификатора и шаблона» с некоторыми небольшими изменениями. ReservedWord — это перечислимое подмножество IdentifierName. Синтаксическая грамматика определяет идентификатор Identifier как IdentifierName, который не является зарезервированным словом ReservedWord. Грамматика идентификатора Unicode основана на свойствах символа, определённых стандартом Unicode. Кодовые точки Unicode в указанных категориях в последней версии стандарта Unicode должны обрабатываться как в этих категориях всеми соответствующими реализациями ECMAScript. Реализации ECMAScript могут распознавать точки кода идентификатора, определенные в более поздних редакциях стандарта Unicode.

 

Примечание 1

Этот стандарт определяет добавление конкретных кодовых точек:

U+0024 (ЗНАК ДОЛЛАРА) и U+005F (НИЗКАЯ ЛИНИЯ) разрешены в любом месте имени идентификатора IdentifierName,

кодовые точки U+200C (НУЛЕВАЯ ШИРИНА, НЕ СОЕДИНЯЮЩАЯ) и U+200D (НУЛЬ. WIDTH JOINER) разрешены где угодно после первой кодовой точки IdentifierName.

Управляющие последовательности Unicode разрешены в IdentifierName, где они вносят одну кодовую точку Unicode в IdentifierName. Кодовая точка выражается CodePoint для UnicodeEscapeSequence (смотри раздел 12.8.4). Обратный слеш \, предшествующий UnicodeEscapeSequence, и единицы кода u и { }, если они появляются, не вносят кодовые точки в IdentifierName. UnicodeEscapeSequence нельзя использовать для помещения кодовой точки в IdentifierName, которая в противном случае была бы недопустимой. Другими словами, если последовательность \ UnicodeEscapeSequence была заменена на SourceCharacter, который она вносит, результатом все равно должно быть допустимое IdentifierName, которое имеет ту же последовательность элементов SourceCharacter, что и исходное IdentifierName. Все интерпретации IdentifierName в этой спецификации основаны на их фактических кодовых точках, независимо от того, использовалась ли escape-последовательность для внесения какой-либо конкретной кодовой точки.

Два идентификатора IdentifierNames, которые канонически эквивалентны в соответствии со стандартом Unicode, не равны, если после замены каждой UnicodeEscapeSequence они не представлены одной и той же последовательностью кодовых точек.

 

Синтаксис

PrivateIdentifier ::

# IdentifierName

IdentifierName ::

IdentifierStart

IdentifierName IdentifierPart

IdentifierStart ::

UnicodeIDStart

$

_

\ UnicodeEscapeSequence

IdentifierPart ::

UnicodeIDContinue

$

\ UnicodeEscapeSequence

<ZWNJ>

<ZWJ>

UnicodeIDStart ::

любая кодовая точка Unicode со свойством Unicode «ID_Start»

UnicodeIDContinue ::

любая кодовая точка Unicode со свойством Unicode «ID_Continue»

 

Определения нетерминальной UnicodeEscapeSequence приведены в разделе 12.8.4.

 

Примечание 2

Нетерминальный элемент IdentifierPart наследует _ через UnicodeIDContinue.

Примечание 3

Наборы кодовых точек со свойствами Unicode «ID_Start» и «ID_Continue» включают, соответственно, кодовые точки со свойствами Unicode «Other_ID_Start» и «Other_ID_Continue».

 

12.6.1 Имена идентификаторов — Identifier Names

12.6.1.1 Статическая семантика: ранние ошибки

IdentifierStart :: \ UnicodeEscapeSequence

  • Это синтаксическая ошибка, если SV для UnicodeEscapeSequence не является ни «$«, ни «_«, ни ! UTF16EncodeCodePoint(cp) для некоторой кодовой точки Unicode cp, соответствующей лексической грамматике UnicodeIDStart.

IdentifierPart :: \ UnicodeEscapeSequence

 

12.6.2 Ключевые слова и Зарезервированные слова

Ключевое слово (keyword) — это токен, который соответствует IdentifierName, но также имеет синтаксическое использование; то есть, он появляется буквально шрифтом фиксированной ширины fixed width в некоторой синтаксической продукции. Ключевые слова ECMAScript включают if, while, async, await и многие другие.

Зарезервированное слово (reserved word) — это идентификационное имя IdentifierName, которое нельзя использовать в качестве идентификатора. Многие ключевые слова являются зарезервированными словами, но некоторые нет, а некоторые зарезервированы только в определенных контекстах. if и while — зарезервированные слова. await зарезервирован только внутри асинхронных функций и модулей. async не зарезервирован; его можно использовать как имя переменной или метку оператора без ограничений.

В этой спецификации используется комбинация грамматических правил и правил ранней ошибки, чтобы указать, какие имена являются допустимыми идентификаторами, а какие — зарезервированными словами. Все токены в списке ReservedWord ниже, за исключением await и yield, безоговорочно зарезервированы. Исключения для await и yield указаны в разделе 13.1 с использованием параметризованных синтаксических производств. Наконец, несколько правил ранней ошибки ограничивают набор допустимых идентификаторов. Смотри разделы 13.1.1, 14.3.1.1, 14.7.5.1 и 15.7.1. Таким образом, существует пять категорий имен идентификаторов:

  • Те, которые всегда разрешены в качестве идентификаторов и не являются ключевыми словами, например Math, window, toString и _;
  • Те, которые никогда не допускаются в качестве идентификаторов, а именно перечисленные ниже ReservedWords, за исключением await и yield;
  • Те, которые контекстно разрешены в качестве идентификаторов, а именно await и yield
  • Те, которые контекстуально запрещены в качестве идентификаторов в коде строгого режима: let, static, implements, interface, package, private, protected и public;
  • Те, которые всегда разрешены как идентификаторы, но также появляются как ключевые слова в определенных синтаксических продуктах, в местах, где идентификатор не разрешен: as, async, from, get, meta, of, set и target.

Термин «условное ключевое слово» (conditional keyword) или «контекстное ключевое слово» (contextual keyword) иногда используется для обозначения ключевых слов, попадающих в последние три категории, и, таким образом, может использоваться как идентификаторы в одних контекстах и как ключевые слова в других.

 

Синтаксис

ReservedWord :: одно из

await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield

Примечание 1

Согласно разделу 5.1.5 ключевые слова в грамматике соответствуют буквальным последовательностям определенных элементов SourceCharacter. Кодовая точка в ключевом слове не может быть выражена с помощью \ UnicodeEscapeSequence.

Идентификационное имя IdentifierName может содержать \ UnicodeEscapeSequences, но невозможно объявить переменную с именем «else», написав els\u{65}. Правила ранних ошибок в разделе 13.1.1 исключают идентификаторы с тем же строковым значением StringValue, что и зарезервированное слово.

Примечание 2

Перечисление enum в настоящее время не используется в качестве ключевого слова в этой спецификации. Это зарезервированное в будущем слово, предназначенное для использования в качестве ключевого слова в будущих расширениях языка.

Точно так же implements, interface, package, private, protected и public — это будущие зарезервированные слова в коде строгого режима.

Примечание 3

Имена arguments и eval не являются ключевыми словами, но они подвержены некоторым ограничениям в коде строгого режима. Смотри разделы 13.1.1, 8.5.4, 15.2.1, 15.5.1, 15.6.1 и 15.8.1.

 

Информационные ссылки

ECMAScript | Язык ECMAScript: лексическая грамматика

Стандарт ECMAScript — Раздел «12.6 Names and Keywords» — https://tc39.es/ecma262/#sec-names-and-keywords