ECMAScript | Оператор switch

ECMAScript | Оператор switch

Синтаксис оператора switch

SwitchStatement [Yield, Await, Return] :

switch ( Expression [+In, ?Yield, ?Await] ) CaseBlock [?Yield, ?Await, ?Return]

CaseBlock [Yield, Await, Return] :

{ CaseClauses [?Yield, ?Await, ?Return] opt }

{ CaseClauses [?Yield, ?Await, ?Return] opt DefaultClause [?Yield, ?Await, ?Return] CaseClauses [?Yield, ?Await, ?Return] opt }

CaseClauses [Yield, Await, Return] :

CaseClause [?Yield, ?Await, ?Return]

CaseClauses [?Yield, ?Await, ?Return] CaseClause [?Yield, ?Await, ?Return]

CaseClause [Yield, Await, Return] :

case Expression [+In, ?Yield, ?Await] : StatementList [?Yield, ?Await, ?Return] opt

DefaultClause [Yield, Await, Return] :

default : StatementList [?Yield, ?Await, ?Return] opt

 

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

SwitchStatement : switch ( Expression ) CaseBlock

 

14.12.2 Семантика времени выполнения: Оценка Блока Случая — CaseBlockEvaluation

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

CaseBlock : { }

1. Вернуть NormalCompletion(undefined).

CaseBlock : { CaseClauses }

1. Пусть V будет undefined.
2. Пусть A будет Списком элементов CaseClause в CaseClauses в порядке исходного текста.
3. Пусть found (найденное) будет false.
4. Для каждого CaseClause C из A выполните
  а. Если found является false, то
    i. Установить found на ? CaseClauseIsSelected(C, input).
  b. Если found является true, то
    i. Пусть R будет результатом вычисления C.
    ii. Если R.[[Value]] не empty, установите V равным R.[[Value]].
    iii. Если R - внезапное завершение, верните завершение Completion(UpdateEmpty(R, V)).
5. Верните нормальное завершение NormalCompletion(V).

CaseBlock : { CaseClauses opt DefaultClause CaseClauses opt }

1. Пусть V будет undefined.
2. Если присутствует первый CaseClauses, то
  а. Пусть A будет Списком элементов CaseClause в первых CaseClauses в порядке исходного текста.
3. Иначе,
  а. Пусть A будет «».
4. Пусть found (найденное) будет false.
5. Для каждого CaseClause C из A выполните
  а. Если found является false, то
    i. Установить found на ? CaseClauseIsSelected(C, input).
  b. Если found является true, то
    i. Пусть R будет результатом вычисления C.
    ii. Если R.[[Value]] не empty, установите V равным R.[[Value]].
    iii. Если R - внезапное завершение, верните завершение Completion(UpdateEmpty(R, V)).
6. Пусть foundInB имеет значение false.
7. Если присутствует второй CaseClauses, то
  а. Пусть B будет списком элементов CaseClause во втором CaseClauses в порядке исходного текста.
8. Иначе,
  а. Пусть B будет «».
9. Если found является false, то
  а. Для каждого CaseClause C из B выполните
    i. Если foundInB является false, то
      1. Установите для foundInB значение ? CaseClauseIsSelected(C, input).
    ii. Если foundInB является true, то
      1. Пусть R будет результатом вычисления CaseClause C.
      2. Если R.[[Value]] не empty, установите V равным R.[[Value]].
      3. Если R - внезапное завершение, верните завершение Completion(UpdateEmpty(R, V)).
10. Если foundInB является true, вернуть NormalCompletion(V).
11. Пусть R будет результатом вычисления DefaultClause.
12. Если R.[[Value]] не empty, установите V равным R.[[Value]].
13. Если R - внезапное завершение, верните завершение Completion(UpdateEmpty(R, V)).
14. ПРИМЕЧАНИЕ. Ниже приводится еще одна полная итерация второго CaseClauses.
15. Для каждого CaseClause C из B выполните:
  а. Пусть R будет результатом вычисления CaseClause C.
  b. Если R.[[Value]] не empty, установите V равным R.[[Value]].
  c. Если R - внезапное завершение, верните завершение Completion(UpdateEmpty(R, V)).
16. Вернуть нормальное завершение NormalCompletion(V).

 

14.12.3 CaseClauseIsSelected ( C, input )

Абстрактная операция CaseClauseIsSelected принимает аргументы C (узел синтаксического анализа CaseClause) и input (значение языка ECMAScript). Он определяет, соответствует ли C вводу input. При вызове она выполняет следующие шаги:

1. Утверждено: C является экземпляром производства CaseClause : case Expression : StatementList opt.
2. Пусть exprRef будет результатом оценки выражения Expression из C.
3. Пусть clauseSelector будет ? GetValue(exprRef).
4. Верните IsStrictlyEqual(input, clauseSelector).
Примечание

Эта операция не выполняет C из StatementList (если есть). Алгоритм CaseBlock использует свое возвращаемое значение, чтобы определить, какой StatementList должен начать выполнение.

 

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

SwitchStatement : switch ( Expression ) CaseBlock

1. Пусть exprRef будет результатом вычисления Expression.
2. Пусть switchValue будет ? GetValue(exprRef).
3. Пусть oldEnv будет LexicalEnvironment текущего контекста выполнения.
4. Пусть blockEnv будет NewDeclarativeEnvironment(oldEnv).
5. Выполните создание экземпляра объявления блока BlockDeclarationInstantiation(CaseBlock, blockEnv).
6. Установите для LexicalEnvironment текущего контекста выполнения значение blockEnv.
7. Пусть R будет CaseBlockEvaluation из CaseBlock с аргументом switchValue.
8. Установите LexicalEnvironment текущего контекста выполнения на oldEnv.
9. Верните R.
Примечание

Независимо от того, как управление покидает SwitchStatement, LexicalEnvironment всегда возвращается в свое прежнее состояние.

CaseClause : case Expression :

1. Верните NormalCompletion(empty).

CaseClause : case Expression : StatementList

1. Верните результат вычисления StatementList.

DefaultClause : default :

1. Верните NormalCompletion(empty).

DefaultClause : default : StatementList

1. Верните результат вычисления StatementList.

 

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

Стандарт ECMAScript — Раздел «14.12 The switch Statement» — https://tc39.es/ecma262/#sec-switch-statement