JavaScript | Оператор continue

JavaScript | Оператор continue

 

Зачем нужен оператор continue в JavaScript?

Тут в целом речь идёт о циклах, пошаговых итерациях и условиях. Представьте, что вы бегаете по массиву с объектами и производите разные манипуляции с ними. Например вы преобразовываете объекты, добавляя свойство P со значением V. Что вы будете делать, когда ваш цикл дойдёт до объекта с уже существующим свойством P, но другим значением V1? Вы перепишете значение? Вы перепишите свойство? Вы сложите значения между собой и добавите к одному свойству?

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

 

Пример для понимания

Есть массив с автомобилями:

var cars = [
   {brand:"BMW"},
   {brand:"Volvo"},
   {brand:"Audi", speed: 222},
   {brand:"Ford"},
   {brand:"Mazda"}
]

Нужно всем автомобилям проставить свойство speed, со значением 99. Если свойство speed встречается у объекта, тогда не преобразовывать и оставлять как есть.

for(i=0; i<cars.length; i++){
   if(cars[i].hasOwnProperty("speed")){
      continue;
   }else{
      cars[i].speed = 99;
   }
}

 

Идея заключается в том, что мы пропустим проход по элементу с брендом Audi т. к. у него уже есть свойство speed. Мы добавим свойство speed к Volvo, а потом будет добавлено свойство к Ford.

Пропустили итерацию при помощи continue - JavaScript
Пропустили итерацию при помощи continue — JavaScript

 

Зарезервированное слово continue

Слово «continue» является зарезервированным словом в JavaScript. Это значит, что его нельзя использовать для именования переменных. Пример:

Зарезервированное слово continue в JavaScript
Зарезервированное слово continue в JavaScript

 

Тип спецификации записи о завершении

Тип Завершения (Completion type) — это Запись, используемая для объяснения распространения значений и потока управления во время выполнения, например поведения операторов (break, continue, return и throw), которые выполняют нелокальную передачу управления.

Значения типа «Завершение» — это значения записей, поля которых определены в таблице 9. Такие значения называются «Записями Завершения» (Completion Records).

Field Name (Имя Поля) Value (Значение) Meaning (Смысл)
[[Type]] Одно из normal, break, continue, return, throw Тип произошедшего завершения.
[[Value]] любое значение языка ECMAScript или empty Значение, которое было произведено.
[[Target]] любая строка ECMAScript или empty Целевая метка для направленных передач управления.

Таблица 9: Поля записи о Завершении

 

Термин «внезапное завершение» (abrupt completion) относится к любому завершению со значением [[Type]], отличным от нормального normal.

 

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

ContinueStatement [Yield, Await] :

continue ;

continue [не LineTerminator здесь] LabelIdentifier [?Yield, ?Await] ;

 

Статическая семантика: Ранние Ошибки

ContinueStatement :

continue ;

continue LabelIdentifier ;

  • Это синтаксическая ошибка, если этот ContinueStatement не вложен, прямо или косвенно (но не пересекает границы функции), в IterationStatement.

 

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

ContinueStatement : continue ;

1. Вернуть Completion { [[Type]]: continue, [[Value]]: empty, [[Target]]: empty }.

ContinueStatement : continue LabelIdentifier ;

1. Пусть label будет StringValue из LabelIdentifier.
2. Вернуть Completion { [[Type]]: continue, [[Value]]: empty, [[Target]]: label }.

 

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

Что такое внезапное завершение? (abrupt completion)

Зарезервированные слова (ReservedWord)

Стандарт ECMAScript — Раздел «12.6.2 Keywords and Reserved Words» — https://tc39.es/ecma262/#prod-ReservedWord

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

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

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

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

Алгоритмические обозначения

Условные обозначения