Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ретурн в свиче можно? (https://javascript.ru/forum/misc/79020-return-v-sviche-mozhno.html)

MC-XOBAHCK 07.12.2019 13:59

Ретурн в свиче можно?
 
Здравствуйте!
Можно ли использовать return внутри switch ?

Вот есть такая функция:
function test(id) {
    let k;

    switch (id) {
        case 'in_1': k = [1, 2, 3, 4]; break;
        case 'in_2': k = [1, 5, 3, 1]; break;
        case 'in_3': k = [7, 4, 1, 3]; break;
    }

    return k;
}


Можно ли эту функцию написать вот так:
function test(id) {
    switch (id) {
        case 'in_1': return [20,180, 200,160]; break;
        case 'in_2': return [110,20, 20,180]; break;
        case 'in_3': return [110,20, 200,160]; break;
    }
}

Нужны ли в таком случае операторы break ? Код вроде как работает. Но тут подсветка редактора VSCode делает все бреки полупрозначными (типа как ненужное) и пишет подсказку на бреках: Обнаружен недостижимый код.
Как лучше и правильней?

MC-XOBAHCK 07.12.2019 14:07

Недосмотрел, это подсказка в редакторе для ts, a я пишу на js.

laimas 07.12.2019 14:11

Switch будет прерван, так что break можно опустить, но первое более ожидаемое по смыслу.

MC-XOBAHCK 07.12.2019 14:14

laimas,
то есть лучше делать через переменную и первый вариант более приемлим?

laimas 07.12.2019 14:17

Цитата:

Сообщение от MC-XOBAHCK
то есть лучше делать через переменную

А напишите длинный switch (хотя это уже плохо) с приличными выражениями. Сама конструкция его предполагает если...брейк, а такая каша с прерываниями или все в куче... Уж тогда из объекта выбирать и возвращать без switch.

MC-XOBAHCK 07.12.2019 14:23

laimas,
Спасибо за подсказку! Я понял - идём по класике с первым вариантом.

рони 07.12.2019 14:27

MC-XOBAHCK,
:-?
function test(id) {
    return {
        'in_1': [1, 2, 3, 4],
       'in_2':  [1, 5, 3, 1],
       'in_3': [7, 4, 1, 3]
    }[id]
}

Aetae 07.12.2019 19:34

Не слушай маразматиков, они те ещё скажут, что больше одного return на функцию нельзя.
Конструкции вида
function test(id) {
  switch (id) {
    case 'in_1': 
      return [20,180, 200,160]; 
    case 'in_2': 
      return [110,20, 20,180]; 
    case 'in_3': 
      return [110,20, 200,160]; 
  }
}
абсолютно валидны, легко читаемы, высокопроизводительны и удобны.

Единственное, на что стоит обращать внимаете - здравый смысл: например мешать return и break действительно нежелательно, чтоб не запутаться; также если не предполагается никаких вычислений или вызовов - то лучше использовать константный объект с набором значений и просто брать их по ключу. (только не так, как написал рони, у него объект целиком заново создаётся каждый вызов)

laimas 07.12.2019 20:10

Цитата:

Сообщение от Aetae
они те ещё скажут, что больше одного return на функцию нельзя

А кто-то говорил? :) Да ну нафиг, что за мазохизм свитчером описывать массивы и возвращать, по свойству в объекте в данном случае более логично.

MC-XOBAHCK 07.12.2019 20:14

рони,
Прикольно, но я этот код понял только после того как ниже Aetae прокомментировал что это объект. Теперь вижу и понимаю что к чему. Спасибо за пример!

Aetae,
Спасибо вам за пояснение. Я свичёвые конструкции в коде люблю - с ними удобно. Но мне ни кто не говорил что больше одного return на функцию нельзя. Это я сам решил спросить у более опытных людей не будет ли ошибкой если я так ретурны расставлю.


Часовой пояс GMT +3, время: 18:51.