Синтаксис оператора 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
- Это синтаксическая ошибка, если LexicallyDeclaredNames из CaseBlock содержит какие-либо повторяющиеся записи.
- Это синтаксическая ошибка, если какой-либо элемент LexicallyDeclaredNames из CaseBlock также встречается в VarDeclaredNames из 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