Операторы перехода — Kotlin
В Kotlin определено три оператора перехода:
return
по умолчанию производит возврат из ближайшей окружающей его функции или анонимной функции;break
завершает выполнение ближайшего окружающего его цикла;continue
продолжает выполнение цикла со следующего его шага, без обработки оставшегося кода текущей итерации.
Все эти выражения можно использовать как часть более крупных выражений:
val s = person.name ?: return
Эти выражения имеют тип Nothing.
Метки операторов break и continue
Любое выражение в Kotlin может быть помечено меткой label.
Метки имеют форму идентификатора, за которым следует знак @
, например abc@
или fooBar@
.
Для того чтобы пометить выражение, мы просто ставим метку перед ним.
loop@ for (i in 1..100) { // ... }
Теперь мы можем уточнить значения операторов break
или continue
с помощью меток.
loop@ for (i in 1..100) { for (j in 1..100) { if (...) break@loop } }
Оператор break
, отмеченный @loop
, переводит выполнение кода в точку сразу после цикла, отмеченного этой меткой.
Оператор continue
продолжает цикл со следующей его итерации.
Возврат к меткам
В Kotlin функции могут быть вложены друг в друга с помощью литералов функций, локальных функций и анонимных объектов.
Подходящий return
позволит вернуться из внешней функции.
Одним из самых важных применений этой синтаксической конструкции является возврат из лямбда-выражения.
Напомним, что в таких случаях, как в примере ниже, return
возвращает из ближайшей заключающей функции — foo
:
fun foo() { listOf(1, 2, 3, 4, 5).forEach { if (it == 3) return // нелокальный возврат, непосредственно к объекту вызывающему функцию foo() print(it) } println("эта строка не достижима") }
Обратите внимание, что такой нелокальный возврат поддерживается только лямбда-выражениями, переданными инлайн-функциям. Чтобы вернуться из лямбда-выражения, к оператору стоит поставить метку и тем самым сделать уточнение для return
.
fun foo() { listOf(1, 2, 3, 4, 5).forEach lit@{ if (it == 3) return@lit // локальный возврат внутри лямбды, то есть к циклу forEach print(it) } print(" выполнится с использованием явной метки(lit@)") }
Теперь он возвращает только из лямбда-выражения. Зачастую намного более удобно использовать неявные метки, потому что такие метки имеют такое же имя, как и функция, к которой относится лямбда.
fun foo() { listOf(1, 2, 3, 4, 5).forEach { if (it == 3) return@forEach // локальный возврат внутри лямбды, то есть к циклу forEach print(it) } print(" выполнится с использованием неявной метки(forEach@)") }
Возможно также использование анонимной функции в качестве альтернативы лямбда-выражениям.
Оператор return
возвращает из самой анонимной функции.
fun foo() { listOf(1, 2, 3, 4, 5). forEach(fun(value: Int) { if (value == 3) return // локальный возврат внутри анонимной функции, то есть к циклу forEach print(value) }) print(" выполнится с использованием анонимной функции") }
Обратите внимание, что использование локальных возвратов в предыдущих трех примерах аналогично использованию continue
в обычных циклах.
Прямого эквивалента для break
не существует, но его можно смоделировать — добавить еще одну вложенную лямбду и нелокально вернуться из нее.
fun foo() { run loop@{ listOf(1, 2, 3, 4, 5).forEach { if (it == 3) return@loop // нелокальный возврат из лямбды к вызывающему run print(it) } } print(" выполнится с использованием вложенной метки") }
При возвращении значения парсер отдаёт предпочтение специализированному возврату.
return@a 1
что значит «верни 1
в метке @a
«, а не «верни выражение с меткой (@a 1)
«.
Правильный способ выйти из цикла forEach в JavaScript
Как выйти из цикла forEach
в JavaScript и выйти из него? Короткий ответ: вы не можете. Выйти из forEach
циклов в JavaScript невозможно. Тем не менее, есть некоторые обходные пути, а также есть альтернативы.
Хотя мы не можем выйти из forEach
в JavaScript, мы все же можем вернуть значения с помощью внешней переменной следующим образом:
let productDetails products.forEach(продукт => { если (продукт.id === 123) { сведения о продукте = продукт } })
forEach.js Обходной путь для возврата значения из forEach
Скопировано в буфер обмена!
Здесь мы, по сути, устанавливаем переменную вне цикла forEach
для одного из элементов на основе идентификатора. Учитывая правильное условие внутри оператора if
, мы можем получить и «вернуть» правильное значение. Однако это можно переписать лучше. Вот пять различных альтернатив, которые вы можете использовать, когда вам нужно отказаться от forEach
.
Хотите улучшить свои навыки? Ознакомьтесь с нашим интерактивным курсом, чтобы освоить JavaScript от начала до конца.
Использование Array.find
Приведенный выше пример можно также переписать с помощью метода find
. Как следует из названия, метод find
используется для поиска определенного элемента в массиве. Он возвращает один элемент, который первым проходит проверку в функции обратного вызова. Например:
// Это вернет продукт с идентификатором 1 products.find(product => product.id === 1) // Даже если у нас может быть несколько товаров со скидкой // это вернет только первое совпадение products.find(product => product.onSale) // Это вернет значение undefined products.find(product => product.id === 'invalid')
find.js Возвращает элемент с заданным предикатом
Скопировано в буфер обмена!
В первом примере возвращается один объект, поскольку каждый идентификатор уникален. Но во втором случае у нас может быть несколько товаров в продаже, но мы все равно получим только первый, прошедший тест. Если совпадений нет, метод find
просто возвращает undefined
.
Использование Array.findIndex
Аналогичное, но немного отличающееся решение для
использует метод findIndex
. Если вам нужно вернуть индекс элемента внутри массива, вы можете использовать метод findIndex
. Это вернет индекс элемента, если он найден. Если элемент с предикатом не найден, возвращается -1.
// Это вернет 2 [1, 2, 3].findIndex(число => число === 3) // Это вернет -1 [1, 2, 3].findIndex(число => число === 4)
findIndex.js Возвращает индекс элемента или -1, если элемент не найден
Скопировано в буфер обмена!
Хотите улучшить свои навыки? Ознакомьтесь с нашим интерактивным курсом, чтобы освоить JavaScript от начала до конца.
Использование Array.
some для возврата True или False Если вам нужно выйти из цикла и вернуть логическое значение, мы можем использовать метод some
. В отличие от find
, где мы ожидаем, что элемент будет возвращен из массива, some
возвращает либо true
false
. Если хотя бы один элемент в массиве соответствует критериям, этот метод мгновенно вернет правда
. Возьмем в качестве примера следующее.// У нас есть некоторые продукты, которые продаются со скидкой, так что мы верим products.some(product => product.onSale) // Ни один из элементов не меньше 0, поэтому мы возвращаем false [1, 2, 3].some(item => item <0)
some.js Возвращает значение true или false, если хотя бы один элемент соответствует предикату.
Скопировано в буфер обмена!
В первом примере мы возвращаем true
, поскольку нас интересует только наличие хотя бы одного товара в продаже. Аналогично, во втором примере нас интересует только, есть ли хотя бы один элемент ниже 0. Поскольку ни один из них не ниже 0, метод возвращает 9.0003 ложь
Использование Array.every для проверки каждого элемента. Но вместо того, чтобы проверять, проходит ли предикат один элемент, он возвращает
true
только в том случае, если все элементы проходят тест. Давайте посмотрим на пример.// Выдает false products.every(product => product.onSale) // Это дает истину products.every(product => product.name)
every.js Возвращает true, если все элементы проходят предикат. В противном случае возвращается false
Скопировано в буфер обмена!
В первом примере мы получаем false
, так как, возможно, не все товары есть в продаже. Однако мы можем проверить, есть ли у каждого продукта имя, и в этом случае каждые
будут давать
истинное значение
.
Хотите улучшить свои навыки? Ознакомьтесь с нашим интерактивным курсом, чтобы освоить JavaScript от начала до конца.
Использование обычных циклов
И последнее, но не менее важное: мы также можем использовать обычные циклы, которые поддерживают операторы break
и continue
. В приведенном ниже примере мы используем обычный цикл for
, for... of
и while
, чтобы продемонстрировать, как прерваться, когда выражение истинно
.
константный массив = [1, 2, 3] // Использование цикла for for (пусть я = 0; я <массив.длина; я++) { если (массив [i] === 2) { сломать } console.log(массив[i]) } // Использование цикла for...of for (константный элемент массива) { если (элемент === 2) { сломать } console.log(элемент) } // Использование цикла while пусть я = 0 в то время как (я <массив.длина) { если (массив [i] === 3) { сломать } console. log(я) я++ }
Скопировано в буфер обмена!
Если вы хотите узнать больше о других методах работы с массивами, таких как map
, filter
или reduce
, обязательно ознакомьтесь с нашей статьей ниже.
Сила функций массивов высшего порядка
найти, некоторые, сопоставить, уменьшить, каждый, фильтровать
Узнайте все, что вам нужно знать о методах массивов высшего порядка и о том, как вы можете использовать их в полной мере.Оператор JavaScript break
❮ Справочник по операторам JavaScript Далее ❯
Примеры
Выход из цикла, когда i равно 3:
let text = "";
for (пусть i = 0; i < 5; i++) {
if (i === 3) break;
text += i + "
";
}
Попробуйте сами »
let text = "";i = 0;
в то время как (i < 5) {
text += i + "
";
я++;
if (i === 3) перерыв;
}
Попробуйте сами »
Дополнительные примеры ниже.
Определение и использование
Оператор break
прерывает переключатель или цикл.
В выключателе выламывается из блока выключателя. Это останавливает выполнение дополнительного кода внутри коммутатора.
В цикле он выходит из цикла и продолжает выполнение кода после цикла (если есть).
Использование меток
Оператор break
может использовать ссылку на метку для выхода из любого блока кода JavaScript (см. «Дополнительные примеры»
ниже).
Без метки разрыв можно использовать только внутри цикла или переключателя.
Синтаксис
перерыв;
Использование дополнительной ссылки на метку:
break labelname;
Дополнительные примеры
Выйти из блока переключателей, когда верно значение case:
let day;
switch (new Date().getDay()) {
case 0:
day = "Воскресенье";
перерыв;
case 1:
day = "Понедельник";
перерыв;
case 2:
day = "Вторник";
перерыв;
case 3:
день = "Среда";
перерыв;
case 4:
день = "Четверг";
перерыв;
случай 5:
день = "Пятница";
перерыв;
случай 6:
день = "Суббота";
перерыв;
}
Попробуйте сами »
Вырваться из списка:
пусть текст = "";
машин = ["BMW", "Volvo", "Saab", "Ford"];
список: {
text += cars[0] + "
";
text += cars[1] + "
";
text += cars[2] + "
";
список перерывов;
text += cars[3] + "
";
}
Попробуйте сами »
Пример
Выход из вложенного цикла:
// Первый цикл for помечен как "Loop1"
Loop1:
for (let i = 0; i < 3; i++) {
// Второй цикл for помечен как "Loop2"
Loop2:
for (let i = 10; i < 15; i++) {
if (i === 12) break Loop1;
}
}
Попробуйте сами »
Связанные страницы
Учебник по JavaScript: JavaScript Break and Continue
Учебник по JavaScript: JavaScript For Loop
Учебник по JavaScript: JavaScript While Loop
Учебник по JavaScript: JavaScript Switch
7 900 continue continue Заявление
Справочник по JavaScript: JavaScript для заявления
Справочник по JavaScript: JavaScript while Заявление
Справочник по JavaScript: Заявление о переключении JavaScript
Поддержка браузера
break
— это функция ECMAScript1 (ES1).
ES1 (JavaScript 1997) полностью поддерживается во всех браузерах:
Хром | Край | Firefox | Сафари | Опера | ИЭ |
Да | Да | Да | Да | Да | Да |
❮ Справочник по операторам JavaScript Следующий ❯
ВЫБОР ЦВЕТА
Лучшие учебники
Учебник HTMLУчебник CSS
Учебник JavaScript
Учебник How To Tutorial
Учебник SQL
Учебник Python
Учебник W3.CSS
Учебник Bootstrap
Учебник PHP
Учебник Java
Учебник по C++
Учебник по jQuery
Основные ссылки
Справочник по HTMLСправочник по CSS
Справочник по JavaScript
Справочник по SQL
Справочник по Python
Справочник по W3.