Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.12.2019, 13:59
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Ретурн в свиче можно?
Здравствуйте!
Можно ли использовать 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 делает все бреки полупрозначными (типа как ненужное) и пишет подсказку на бреках: Обнаружен недостижимый код.
Как лучше и правильней?
Ответить с цитированием
  #2 (permalink)  
Старый 07.12.2019, 14:07
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Недосмотрел, это подсказка в редакторе для ts, a я пишу на js.
Ответить с цитированием
  #3 (permalink)  
Старый 07.12.2019, 14:11
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Switch будет прерван, так что break можно опустить, но первое более ожидаемое по смыслу.
Ответить с цитированием
  #4 (permalink)  
Старый 07.12.2019, 14:14
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

laimas,
то есть лучше делать через переменную и первый вариант более приемлим?
Ответить с цитированием
  #5 (permalink)  
Старый 07.12.2019, 14:17
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от MC-XOBAHCK
то есть лучше делать через переменную
А напишите длинный switch (хотя это уже плохо) с приличными выражениями. Сама конструкция его предполагает если...брейк, а такая каша с прерываниями или все в куче... Уж тогда из объекта выбирать и возвращать без switch.
Ответить с цитированием
  #6 (permalink)  
Старый 07.12.2019, 14:23
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

laimas,
Спасибо за подсказку! Я понял - идём по класике с первым вариантом.
Ответить с цитированием
  #7 (permalink)  
Старый 07.12.2019, 14:27
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

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]
}
Ответить с цитированием
  #8 (permalink)  
Старый 07.12.2019, 19:34
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

Не слушай маразматиков, они те ещё скажут, что больше одного 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 действительно нежелательно, чтоб не запутаться; также если не предполагается никаких вычислений или вызовов - то лучше использовать константный объект с набором значений и просто брать их по ключу. (только не так, как написал рони, у него объект целиком заново создаётся каждый вызов)
__________________
29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 07.12.2019, 20:10
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Aetae
они те ещё скажут, что больше одного return на функцию нельзя
А кто-то говорил? Да ну нафиг, что за мазохизм свитчером описывать массивы и возвращать, по свойству в объекте в данном случае более логично.
Ответить с цитированием
  #10 (permalink)  
Старый 07.12.2019, 20:14
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какую можно применить сортировку комбинаций из 2х значений alex-romanov Общие вопросы Javascript 19 27.06.2019 11:10
Исчезающий текст, можно ли упростить скрипт? Djavastik Общие вопросы Javascript 7 22.01.2018 16:44
If можно поточнее? FeaR51 Общие вопросы Javascript 20 09.05.2011 00:28
Можно ли удалить клонированный объект Евгений_86 jQuery 6 13.04.2011 12:54
Можно ли как-то сократить скрипт случайной цитаты (см. внутри)? Hyuga_Nia Общие вопросы Javascript 4 20.01.2011 22:00