ECMAScript | Первичное выражение (Primary Expression)

Синтаксис первичного выражения

PrimaryExpression [Yield, Await] :

this

IdentifierReference [?Yield, ?Await]

Literal

ArrayLiteral [?Yield, ?Await]

ObjectLiteral [?Yield, ?Await]

FunctionExpression

ClassExpression [?Yield, ?Await]

GeneratorExpression

AsyncFunctionExpression

AsyncGeneratorExpression

RegularExpressionLiteral

TemplateLiteral [?Yield, ?Await, ~Tagged]

CoverParenthesizedExpressionAndArrowParameterList [?Yield, ?Await]

 

CoverParenthesizedExpressionAndArrowParameterList [Yield, Await] :

( Expression [+In, ?Yield, ?Await] )

( Expression [+In, ?Yield, ?Await] , )

( )

( … BindingIdentifier [?Yield, ?Await] )

( … BindingPattern [?Yield, ?Await] )

( Expression [+In, ?Yield, ?Await] , … BindingIdentifier [?Yield, ?Await] )

( Expression [+In, ?Yield, ?Await] , … BindingPattern [?Yield, ?Await] )

Дополнительный синтаксис

При обработке экземпляра продукции

PrimaryExpression [Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList [?Yield, ?Await]

интерпретация CoverParenthesizedExpressionAndArrowParameterList уточняется с использованием следующей грамматики:

ParenthesizedExpression [Yield, Await] :

( Expression [+In, ?Yield, ?Await] )

 

Ключевое слово this

Семантика времени выполнения: оценка

PrimaryExpression : this

1. Вернуть ? ResolveThisBinding().

 

Ссылка на идентификатор

Смотри 13.1 для IdentifierReference.

 

Литералы

Синтаксис литералов

Literal :

NullLiteral

BooleanLiteral

NumericLiteral

StringLiteral

 

Семантика времени выполнения: оценка

Literal : NullLiteral

1. Вернуть null.

Literal : BooleanLiteral

1. Если BooleanLiteral является токеном false, вернуть false.
2. Если BooleanLiteral является токеном true, вернуть true.

Literal : NumericLiteral

1. Верните NumericValue для NumericLiteral, как определено в 12.8.3.

Literal : StringLiteral

1. Верните SV из StringLiteral, как определено в 12.8.4.1.

 

Инициализатор массива

Примечание

ArrayLiteral — это выражение, описывающее инициализацию объекта Array с использованием списка из нуля или более выражений, каждое из которых представляет элемент массива, заключенного в квадратные скобки. Элементы не обязательно должны быть литералами; они оцениваются каждый раз, когда оценивается инициализатор массива.

Элементы массива могут быть опущены в начале, середине или конце списка элементов. Когда запятой в списке элементов не предшествует AssignmentExpression (т.е. запятая в начале или после другой запятой), отсутствующий элемент массива способствует увеличению длины Массива и увеличивает индекс последующих элементов. Исключаемые элементы массива не определены. Если элемент опущен в конце массива, этот элемент не влияет на длину Массива.

Синтаксис Литерала Массива

ArrayLiteral [Yield, Await] :

[ Elision opt ]

[ ElementList [?Yield, ?Await] ]

[ ElementList [?Yield, ?Await] , Elision opt ]

ElementList [Yield, Await] :

Elision opt AssignmentExpression [+In, ?Yield, ?Await]

Elision opt SpreadElement [?Yield, ?Await]

ElementList [?Yield, ?Await] , Elision opt AssignmentExpression [+In, ?Yield, ?Await]

ElementList [?Yield, ?Await] , Elision opt SpreadElement [?Yield, ?Await]

Elision :

,

Elision ,

SpreadElement [Yield, Await] :

AssignmentExpression [+In, ?Yield, ?Await]

 

Семантика времени выполнения: Накопление массива — ArrayAccumulation

С параметрами array и nextIndex.

Elision : ,

1. Пусть len будет nextIndex + 1.
2. Выполнить ? Установить Set(array, "length", 𝔽(len), true).
3. ПРИМЕЧАНИЕ. Приведенный выше набор срабатывает, если len превышает 232-1.
4. Вернуть len.

 

Elision : Elision ,

1. Верните результат выполнения ArrayAccumulation для Elision с аргументами array и nextIndex + 1.

 

ElementList : Elision opt AssignmentExpression

1. Если присутствует Elision, то
   а. Установите nextIndex равным результату выполнения ArrayAccumulation для Elision с аргументами array и nextIndex.
   b. ReturnIfAbrupt(nextIndex).
2. Пусть initResult будет результатом вычисления AssignmentExpression.
3. Пусть initValue будет ? GetValue(initResult).
4. Пусть created будет ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), initValue).
5. Верните nextIndex + 1.

 

ElementList : Elision opt SpreadElement

1. Если присутствует Elision, то
   а. Установите nextIndex равным результату выполнения ArrayAccumulation для Elision с аргументами array и nextIndex.
   b. ReturnIfAbrupt(nextIndex).
2. Вернуть результат выполнения ArrayAccumulation для SpreadElement с аргументами array и nextIndex.

 

ElementList : ElementList , Elision opt AssignmentExpression

1. Установите nextIndex равным результату выполнения ArrayAccumulation для ElementList с аргументами array и nextIndex.
2. ReturnIfAbrupt(nextIndex).
3. Если присутствует Elision, то
   а. Установите nextIndex равным результату выполнения ArrayAccumulation для Elision с аргументами array и nextIndex.
   b. ReturnIfAbrupt(nextIndex).
4. Пусть initResult будет результатом вычисления AssignmentExpression.
5. Пусть initValue будет ? GetValue(initResult).
6. Пусть created будет ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), initValue).
7. Верните nextIndex + 1.

 

ElementList : ElementList , Elision opt SpreadElement

1. Установите nextIndex равным результату выполнения ArrayAccumulation для ElementList с аргументами array и nextIndex.
2. ReturnIfAbrupt(nextIndex).
3. Если присутствует Elision, то
   а. Установите nextIndex равным результату выполнения ArrayAccumulation для Elision с аргументами array и nextIndex.
   b. ReturnIfAbrupt(nextIndex).
4. Вернуть результат выполнения ArrayAccumulation для SpreadElement с аргументами array и nextIndex.

 

SpreadElement :  AssignmentExpression

1. Пусть spreadRef будет результатом вычисления AssignmentExpression.
2. Пусть spreadObj будет ? GetValue(spreadRef).
3. Пусть iteratorRecord будет ? GetIterator(spreadObj).
4. Повторите,
   а. Пусть next будет ? IteratorStep(iteratorRecord).
   b. Если next является false (ложно), верните nextIndex.
   c. Пусть nextValue будет ? IteratorValue(next).
   d. Выполнять ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), nextValue).
   е. Установите nextIndex на nextIndex + 1.

 

Примечание

CreateDataPropertyOrThrow используется для обеспечения того, чтобы для массива были определены собственные свойства, даже если стандартный встроенный объект-прототип Array был изменен таким образом, чтобы исключить создание новых собственных свойств с помощью [[Set]].

 

Семантика времени выполнения: оценка

ArrayLiteral : [ Elision opt ]

1. Пусть массив array будет ! ArrayCreate(0).
2. Если присутствует Elision, то
   а. Пусть len будет результатом выполнения ArrayAccumulation для Elision с аргументами array и 0.
   b. ReturnIfAbrupt(len).
3. Вернуть массив array.

 

ArrayLiteral : [ ElementList ]

1. Пусть массив array будет ! ArrayCreate(0).
2. Пусть len будет результатом выполнения ArrayAccumulation для ElementList с аргументами array и 0.
3. ReturnIfAbrupt(len).
4. Вернуть массив array.

 

ArrayLiteral : [ ElementList , Elision opt ]

1. усть массив array будет ! ArrayCreate(0).
2. Пусть nextIndex будет результатом выполнения ArrayAccumulation для ElementList с аргументами array и 0.
3. ReturnIfAbrupt(nextIndex).
4. Если присутствует Elision, то
   а. Пусть len будет результатом выполнения ArrayAccumulation для Elision с аргументами array и nextIndex.
   b. ReturnIfAbrupt(len).
5. Вернуть массив array.

 

 

Инициализатор объекта

Примечание 1

Инициализатор объекта — это выражение, описывающее инициализацию Объекта, записанное в форме, напоминающей литерал. Это список из нуля или более пар ключей свойств и связанных значений, заключенный в фигурные скобки. Значения не обязательно должны быть литералами; они оцениваются каждый раз, когда оценивается инициализатор объекта.

Синтаксис Литерала Объекта

ObjectLiteral [Yield, Await] :

{ }

{ PropertyDefinitionList [?Yield, ?Await] }

{ PropertyDefinitionList [?Yield, ?Await] , }

 

PropertyDefinitionList [Yield, Await] :

PropertyDefinition [?Yield, ?Await]

PropertyDefinitionList [?Yield, ?Await] , PropertyDefinition [?Yield, ?Await]

 

PropertyDefinition [Yield, Await] :

IdentifierReference [?Yield, ?Await]

CoverInitializedName [?Yield, ?Await]

PropertyName [?Yield, ?Await] : AssignmentExpression [+In, ?Yield, ?Await]

MethodDefinition [?Yield, ?Await]

AssignmentExpression [+In, ?Yield, ?Await]

 

PropertyName [Yield, Await] :

LiteralPropertyName

ComputedPropertyName [?Yield, ?Await]

 

LiteralPropertyName :

IdentifierName

StringLiteral

NumericLiteral

 

ComputedPropertyName [Yield, Await] :

[ AssignmentExpression [+In, ?Yield, ?Await] ]

 

CoverInitializedName [Yield, Await] :

IdentifierReference [?Yield, ?Await] Initializer [+In, ?Yield, ?Await]

 

Initializer [In, Yield, Await] :

= AssignmentExpression [?In, ?Yield, ?Await]

 

Примечание 2

Определение метода (MethodDefinition) определено в 15.4.

 

Примечание 3

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

 

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

PropertyDefinition : MethodDefinition

Помимо описания фактического инициализатора объекта, продукция ObjectLiteral также используется в качестве грамматики обложки для ObjectAssignmentPattern и может быть распознана как часть CoverParenthesizedExpressionAndArrowParameterList. Когда ObjectLiteral появляется в контексте, где требуется ObjectAssignmentPattern, следующие правила ранней ошибки НЕ применяются. Кроме того, они не применяются при первоначальном анализе CoverParenthesizedExpressionAndArrowParameterList или CoverCallExpressionAndAsyncArrowHead.

 

PropertyDefinition : CoverInitializedName

Всегда выдавать синтаксическую ошибку, если код соответствует этому продукту.

Примечание

Это производство существует для того, чтобы ObjectLiteral мог служить грамматикой покрытия для ObjectAssignmentPattern. Это не может произойти в фактическом инициализаторе объекта.

Статическая семантика: Является ли Вычисляемым Ключом Свойства — IsComputedPropertyKey

PropertyName : LiteralPropertyName

1. Вернуть false.

PropertyName : ComputedPropertyName

1. Вернуть true.

Статическая семантика: Список Имён Свойств — PropertyNameList

PropertyDefinitionList : PropertyDefinition

1. Если PropName в PropertyDefinition является empty (пусто), вернуть новый пустой Список.
2. Верните Список, единственным элементом которого является PropName из PropertyDefinition.

PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition

1. Пусть list будет PropertyNameList из PropertyDefinitionList.
2. Если PropName в PropertyDefinition является empty (пусто), вернуть list.
3. Добавьте PropName свойства PropertyDefinition в конец list.
4. Вернуть list.

Семантика времени выполнения: оценка

ObjectLiteral : { }

1. Вернуть ! OrdinaryObjectCreate(%Object.prototype%).

ObjectLiteral :

{ PropertyDefinitionList }

{ PropertyDefinitionList , }

1. Пусть obj будет ! OrdinaryObjectCreate(%Object.prototype%).
2. Выполнить ? PropertyDefinitionEvaluation из PropertyDefinitionList с аргументами obj и true.
3. Вернуть obj.

LiteralPropertyName : IdentifierName

1. Вернуть строковое значение StringValue из IdentifierName.

LiteralPropertyName : StringLiteral

1. Вернуть SV из StringLiteral.

LiteralPropertyName : NumericLiteral

1. Пусть nbr будет числовым значением NumericValue из NumericLiteral.
2. Вернуть ! ToString(nbr).

ComputedPropertyName : [ AssignmentExpression ]

1. Пусть exprValue будет результатом вычисления AssignmentExpression.
2. Пусть propName будет ? GetValue(exprValue).
3. Вернуть ? ToPropertyKey(propName).

Семантика времени выполнения: Оценка Определения Свойства — PropertyDefinitionEvaluation

С параметрами object и enumerable.

PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition

1. Выполнить ? PropertyDefinitionEvaluation из PropertyDefinitionList с аргументами object и enumerable.
2. Вернуть результат выполнения PropertyDefinitionEvaluation из PropertyDefinition с аргументами object и enumerable.

PropertyDefinition :  AssignmentExpression

1. Пусть exprValue будет результатом вычисления AssignmentExpression.
2. Пусть fromValue будет ? GetValue(exprValue).
3. Пусть excludedNames будет новым пустым Списком.
4. Вернуть ? CopyDataProperties(object, fromValue, excludedNames).

PropertyDefinition : IdentifierReference

1. Пусть propName будет StringValue для IdentifierReference.
2. Пусть exprValue будет результатом вычисления IdentifierReference.
3. Пусть propValue будет ? GetValue(exprValue).
4. Утверждено: перечислимое enumerable является true.
5. Утверждено: объект object - это обычный расширяемый объект, без неконфигурируемых свойств.
6. Вернуть ! CreateDataPropertyOrThrow(object, propName, propValue).

PropertyDefinition : PropertyName : AssignmentExpression

1. Пусть propKey будет результатом вычисления PropertyName.
2. ReturnIfAbrupt(propKey).
3. Если IsAnonymousFunctionDefinition(AssignmentExpression) является true (истинно), то
а. Пусть propValue будет ? NamedEvaluation выражения AssignmentExpression с аргументом propKey.
4. Иначе,
   а. Пусть exprValueRef будет результатом вычисления AssignmentExpression.
   b. Пусть propValue будет ? GetValue(exprValueRef).
5. Утверждено: перечислимое enumerable является true.
6. Утверждено: объект object - это обычный расширяемый объект, без неконфигурируемых свойств.
7. Вернуть ! CreateDataPropertyOrThrow(object, propKey, propValue).
Примечание

Альтернативная семантика для этой продукции приведена в B.3.1.

MethodDefinition :

ClassElementName ( UniqueFormalParameters ) { FunctionBody }

get ClassElementName ( ) { FunctionBody }

set ClassElementName ( PropertySetParameterList ) { FunctionBody }

1. Вернуть ? MethodDefinitionEvaluation из MethodDefinition с аргументами object и enumerable.

GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }

1. Вернуть ? MethodDefinitionEvaluation из GeneratorMethod с аргументами object и enumerable.

AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }

1. Вернуть ? MethodDefinitionEvaluation из AsyncGeneratorMethod с аргументами object и enumerable.

AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }

1. Вернуть ? MethodDefinitionEvaluation из AsyncMethod с аргументами object и enumerable.

 

 

 

Выражения, определяющие функции

Смотри 15.2 для PrimaryExpression : FunctionExpression .

Смотри 15.5 для PrimaryExpression : GeneratorExpression .

Смотри 15.7 для PrimaryExpression : ClassExpression .

Смотри 15.8 для PrimaryExpression : AsyncFunctionExpression .

Смотри 15.6 для PrimaryExpression : AsyncGeneratorExpression .

 

Литералы регулярных выражений

Синтаксис литерала регулярного выражения

Смотри раздел 12.8.5.

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

PrimaryExpression : RegularExpressionLiteral

Статическая семантика: Является Ли Корректным Литерал Регулярного Выражения — IsValidRegularExpressionLiteral ( literal )

Абстрактная операция IsValidRegularExpressionLiteral (Является Ли Корректным Литерал Регулярного Выражения) принимает аргумент literal. Она определяет, является ли его аргумент допустимым литералом регулярного выражения. При вызове она выполняет следующие шаги:

1. Утверждено: literal - это RegularExpressionLiteral.
2. Если FlagText литерала literal содержит любые кодовые точки, отличные от g, i, m, s, u или y, или если он содержит одну и ту же кодовую точку более одного раза, вернуть false.
3. Пусть patternText будет BodyText литерала literal.
4. Если FlagText литерала literal содержит u, пусть u является true (истинно); иначе пусть u является false (ложь).
5. Если u является false (ложь), то
   а. Пусть stringValue будет CodePointsToString(patternText).
   b. Задайте в patternText последовательность кодовых точек, полученных в результате интерпретации каждого из 16-битных элементов stringValue как кодовой точки Unicode BMP. К элементам не применяется декодирование UTF-16.
6. Пусть parseResult будет ParsePattern(patternText, u).
7. Если parseResult является Узлом Синтаксического Анализа, вернуть true; иначе верните false.

Семантика времени выполнения: оценка

PrimaryExpression : RegularExpressionLiteral

1. Пусть pattern будет ! CodePointsToString(BodyText из RegularExpressionLiteral).
2. Пусть flags будут ! CodePointsToString(FlagText из RegularExpressionLiteral).
3. Вернуть RegExpCreate(pattern, flags).

 

Литералы Шаблона

Синтаксис Литерала Шаблона

TemplateLiteral [Yield, Await, Tagged] :

NoSubstitutionTemplate

SubstitutionTemplate [?Yield, ?Await, ?Tagged]

SubstitutionTemplate [Yield, Await, Tagged] :

TemplateHead Expression [+In, ?Yield, ?Await] TemplateSpans [?Yield, ?Await, ?Tagged]

TemplateSpans [Yield, Await, Tagged] :

TemplateTail

TemplateMiddleList [?Yield, ?Await, ?Tagged] TemplateTail

TemplateMiddleList [Yield, Await, Tagged] :

TemplateMiddle Expression [+In, ?Yield, ?Await]

TemplateMiddleList [?Yield, ?Await, ?Tagged] TemplateMiddle Expression [+In, ?Yield, ?Await]

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

TemplateLiteral [Yield, Await, Tagged] : NoSubstitutionTemplate

TemplateLiteral [Yield, Await, Tagged] : SubstitutionTemplate [?Yield, ?Await, ?Tagged]

  • Это синтаксическая ошибка, если количество элементов в результате TemplateStrings для TemplateLiteral с аргументом false больше 232 — 1.

SubstitutionTemplate [Yield, Await, Tagged] : TemplateHead Expression [+In, ?Yield, ?Await] TemplateSpans [?Yield, ?Await, ?Tagged]

TemplateSpans [Yield, Await, Tagged] : TemplateTail

TemplateMiddleList [Yield, Await, Tagged] :

TemplateMiddle Expression [+In, ?Yield, ?Await]

TemplateMiddleList [?Yield, ?Await, ?Tagged] TemplateMiddle Expression [+In, ?Yield, ?Await]

Статическая семантика: Строки Шаблона — TemplateStrings

С параметром raw.

TemplateLiteral : NoSubstitutionTemplate

1. Если raw является false (ложно), то
   а. Пусть строка string будет TV NoSubstitutionTemplate.
2. Иначе,
   а. Пусть строка string будет TRV шаблона NoSubstitutionTemplate.
3. Вернуть Список, единственным элементом которого является string.

SubstitutionTemplate : TemplateHead Expression TemplateSpans

1. Если необработанный raw является false (ложно), то
   а. Пусть head будет TV для TemplateHead.
2. Иначе,
   а. Пусть head будет TRV для TemplateHead.
3. Пусть tail будет TemplateStrings из TemplateSpans с аргументом raw.
4. Вернуть список, элементы которого являются заголовком head, за которым следуют элементы хвоста tail.

TemplateSpans : TemplateTail

1. Если raw является false (ложно), то
   а. Пусть tail будет TV для TemplateTail.
2. Иначе,
   а. Пусть tail будет TRV для TemplateTail.
3. Вернуть список, единственным элементом которого является хвост tail.

TemplateSpans : TemplateMiddleList TemplateTail

1. Пусть middle будет TemplateStrings из TemplateMiddleList с необработанным аргументом raw.
2. Если raw имеет значение false (ложно), тогда
   а. Пусть tail будет TV для TemplateTail.
3. Иначе,
   а. Пусть tail будет TRV для TemplateTail.
4. Вернуть список, элементы которого являются элементами середины middle, за которой следует хвост tail.

TemplateMiddleList : TemplateMiddle Expression

1. Если raw имеет значение false (ложно), тогда
   а. Пусть строка string будет TV для TemplateMiddle.
2. Иначе,
   а. Пусть строка string будет TRV для TemplateMiddle.
3. Вернуть список, единственным элементом которого является строка string.

TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression

1. Пусть front будет TemplateStrings из TemplateMiddleList с необработанным аргументом raw.
2. Если raw имеет значение false (ложно), тогда
   а. Пусть last будет TV для TemplateMiddle.
3. Иначе,
   а. Пусть last будет TRV для TemplateMiddle.
4. Добавить last как последний элемент на списка front.
5. Возврат front.

 

GetTemplateObject ( templateLiteral )

Абстрактная операция GetTemplateObject (Получить объект шаблона) принимает аргумент templateLiteral (узел синтаксического анализа). При вызове она выполняет следующие шаги:

1. Пусть realm будет текущей Записью Области.
2. Пусть templateRegistry будет realm.[[TemplateMap]].
3. Для каждого элемента e из templateRegistry выполните
   а. Если e.[[Site]] - это тот же узел Синтаксического Анализа, что и templateLiteral, тогда
      i. Верните e.[[Array]].
4. Пусть rawStrings будет TemplateStrings из templateLiteral с аргументом true.
5. Пусть cookedStrings будет TemplateStrings элемента templateLiteral с аргументом false.
6. Пусть count будет количеством элементов в List из cookedStrings.
7. Утверждено: count ≤ 232 - 1.
8. Пусть template будет ! ArrayCreate(count).
9. Пусть rawObj будет ! ArrayCreate(count).
10. Пусть index равен 0.
11. Повторите, пока index < count,
   а. Пусть prop будет ! ToString(𝔽(index)).
   b. Пусть cookedValue будет cookedStrings[index].
   c. Выполнить ! DefinePropertyOrThrow(template, prop, PropertyDescriptor {[[Value]]: cookedValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false}) ».
   d. Пусть rawValue будет строковым значением rawStrings[index].
   е. Выполнить ! DefinePropertyOrThrow(rawObj, prop, PropertyDescriptor {[[Значение]]: rawValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false}).
   f. Установите index на index + 1.
12. Выполнить ! SetIntegrityLevel(rawObj, frozen).
13. Выполнить ! DefinePropertyOrThrow(template, "raw", PropertyDescriptor {[[Value]]: rawObj, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false} ".
14. Выполнить ! SetIntegrityLevel(template, frozen).
15. Добавьте Запись {[[Site]]: templateLiteral, [[Array]]: template } в templateRegistry.
16. Вернуть template.

 

Примечание 1

Создание объекта шаблона не может привести к внезапному завершению.

 

Примечание 2

Каждый TemplateLiteral в программном коде области связан с уникальным объектом шаблона, который используется при оценке Шаблонов с тегами (13.2.8.5). Объекты шаблона замораживаются, и один и тот же объект шаблона используется каждый раз, когда оценивается определенный шаблон с тегами. Независимо от того, создаются ли объекты шаблона лениво при первой оценке TemplateLiteral или с нетерпением перед первой оценкой, — это выбор реализации, который не наблюдается для кода ECMAScript.

 

Примечание 3

В будущих редакциях этой спецификации могут быть определены дополнительные неперечислимые свойства объектов шаблона.

 

Семантика среды выполнения: оценка замещения

TemplateSpans : TemplateTail

1. Верните новый пустой Список.

TemplateSpans : TemplateMiddleList TemplateTail

1. Верните результат SubstitutionEvaluation для TemplateMiddleList.

TemplateMiddleList : TemplateMiddle Expression

1. Пусть subRef будет результатом вычисления Expression.
2. Пусть sub будет? GetValue(subRef).
3. Вернуть Список, единственным элементом которого является sub.

TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression

1. Пусть preceding будет ? SubstitutionEvaluation из TemplateMiddleList.
2. Пусть nextRef будет результатом вычисления Expression.
3. Пусть next будет ? GetValue(nextRef).
4. Добавить next как последний элемент Списка preceding.
5. Вернуть preceding.

 

Семантика времени выполнения: оценка

TemplateLiteral : NoSubstitutionTemplate

1. Вернуть TV с шаблоном NoSubstitutionTemplate, как определено в пункте 12.8.6.

SubstitutionTemplate : TemplateHead Expression TemplateSpans

1. Пусть head будет телевизором TemplateHead, как определено в 12.8.6.
2. Пусть subRef будет результатом вычисления Expression.
3. Пусть sub будет? GetValue(subRef).
4. Пусть middle будет ? ToString(sub).
5. Пусть tail будет результатом оценки TemplateSpans.
6. ReturnIfAbrupt(tail).
7. Верните конкатенацию строк головы head, середины middle и хвоста tail.

 

Примечание 1

Семантика преобразования строк, применяемая к значению Expression, похожа на String.prototype.concat, а не на оператор +.

 

TemplateSpans : TemplateTail

1. Верните TV из TemplateTail, как определено в 12.8.6.

TemplateSpans : TemplateMiddleList TemplateTail

1. Пусть head будет результатом вычисления TemplateMiddleList.
2. ReturnIfAbrupt(head).
3. Пусть tail будет TV из TemplateTail, как определено в 12.8.6.
4. Верните конкатенацию строк головы head и хвоста tail.

TemplateMiddleList : TemplateMiddle Expression

1. Пусть head будет TV из TemplateMiddle, как определено в 12.8.6.
2. Пусть subRef будет результатом вычисления Expression.
3. Пусть sub будет ? GetValue(subRef).
4. Пусть middle будет ? ToString(sub).
5. Верните конкатенацию строк головы head и середины middle.

 

Примечание 2

Семантика преобразования строк, применяемая к значению Expression, похожа на String.prototype.concat, а не на оператор +.

 

TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression

1. Пусть rest будет результатом вычисления TemplateMiddleList.
2. ReturnIfAbrupt(rest).
3. Пусть middle будет TV для TemplateMiddle, как определено в 12.8.6.
4. Пусть subRef будет результатом вычисления Expression.
5. Пусть sub будет ? GetValue(subRef).
6. Пусть last будет ? ToString(sub).
7. Верните конкатенацию строк из rest, middle и last.

 

Примечание 3

Семантика преобразования строк, применяемая к значению Expression, похожа на String.prototype.concat, а не на оператор +.

 

 

Оператор группировки

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

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList

Семантика времени выполнения: оценка

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList

1. Пусть expr будет ParenthesizedExpression, которое покрывается CoverParenthesizedExpressionAndArrowParameterList.
2. Вернуть результат вычисления expr.

ParenthesizedExpression : ( Expression )

1. Верните результат вычисления Expression. Это может быть тип Reference (ссылка).
Примечание

Этот алгоритм не применяет GetValue к результату вычисления Expression. Основная мотивация для этого заключается в том, что такие операторы, как delete и typeof, могут применяться к выражениям в скобках.

 

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

Стандарт ECMAScript — Раздел «13.2 Primary Expression» — https://tc39.es/ecma262/#sec-primary-expression

Поделись записью