Использование «return» вместо «else» в JavaScript - PullRequest
20 голосов
/ 30 ноября 2009

Я работаю над проектом, который требует довольно сложной обработки JavaScript. Это включает в себя множество вложенных if - else s в довольно многих местах. Обычно я старался максимально оптимизировать код JavaScript, читая другие советы по переполнению стека, но мне интересно, будут ли две следующие конструкции иметь какое-либо значение с точки зрения скорости:

if(some_condition) {
    // process
    return ;
}

// Continue the else condition here

против

if(some_condition) {
    // Process
}

else {
   // The 'else' condition...
}

Ответы [ 13 ]

17 голосов
/ 30 ноября 2009

Я всегда иду с первым методом. Легче читать и меньше отступов. Что касается скорости выполнения, это будет зависеть от реализации, но я ожидаю, что они оба будут идентичны.

5 голосов
/ 30 ноября 2009

Во многих языках обычной практикой является инвертирование if операторов для сокращения вложенности или использование предварительных условий .

А меньшее вложение в коде улучшает читабельность кода и удобство обслуживания.

3 голосов
/ 30 ноября 2009

«Профиль, не спекулируйте!»

  1. Вы ставите телегу перед лошадью (ремонтопригодность человека превосходит скорость машины)
  2. вы должны оптимизировать свои усилия с помощью измерений , что означает

    • вы должны сами рассчитать время казни; очевидно, он будет отличаться в разных браузерах и версиях
    • Вы должны оптимизировать только для скорости горячих точек вашего приложения (см. Пункт 1)
2 голосов
/ 21 августа 2015

Я буду использовать первый подход при исключении недопустимых ситуаций.

Например. использовать первый подход при выполнении некоторых проверок и возвращать, если какая-либо из проверок завершилась неудачно. Нет смысла идти дальше, если какое-либо из предварительных условий не выполняется. Об этом же упоминает Мартин Фаулер в своей книге Refactoring . Он называет это «Замена условий пунктами охраны». И это действительно может сделать код легким для понимания.

Вот пример Java.

  public void debitAccount(Account account, BigDecimal amount) {
    if(account.user == getCurrentUser()) {
      if(account.balance > amount) {
           account.balance = account.balance - amount
       } else {
          //return or throw exception
       }
    } else {
        //return or throw exception
    }
  }

VS

 public void debitAccount(Account account, BigDecimal amount) {
    if(account.user != getCurrentUser()) return //or error
    if(account.balance < amount) return //or error
    account.balance = account.balance - amount    
}
2 голосов
/ 30 ноября 2009

Различий в производительности не будет, я бы порекомендовал второй пример для удобства обслуживания. В целом, хорошей практикой является наличие одной и только одной возможной точки выхода для рутины. Это помогает отладке и пониманию.

1 голос
/ 30 ноября 2009

Хотя это зависит от реализации JavaScript работающего браузера, между ними не должно быть заметной разницы (с точки зрения скорости).

Вторая форма предпочтительнее, так как прерывание потока не является хорошей привычкой программирования. Также подумайте о том, что при сборке инструкция перехода (микрооперация) всегда вычисляется независимо от оценки.

1 голос
/ 30 ноября 2009

Может быть, немного, но я не думаю, что это будет измеримо, если остальная часть функции не включает в себя «тяжелые» (и в противном случае избыточные, поскольку я предполагаю, что возвращение дало бы тот же результат) вызовы js.

В качестве примечания, я думаю, что это ненужная микрооптимизация, и вам, вероятно, следует поискать улучшения производительности в другом месте, то есть профилировать скрипт с помощью инструментов разработчика Chrome или Firebug для Firefox (или аналогичных инструментов) и искать медленный / длительный запуск. вызовов / функций.

0 голосов
/ 27 ноября 2016

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

0 голосов
/ 22 сентября 2016

Если говорить по моему опыту, это зависит от состояния, которое вы проверяете.

  1. if .. return хорошо и легко читается, если вы проверите некоторое логическое условие (возможно, настройку), которое сделает весь следующий код ненужным для выполнения.

  2. if .. else гораздо легче читать, если вы ожидаете, что какое-то значение будет одним из двух (или более) возможных значений, и вы хотите выполнить разные коды для обоих случаев. Значение двух возможных значений представляет условия одинакового интерпретируемого значения и поэтому должно быть записано на одном и том же логическом уровне.

0 голосов
/ 23 декабря 2015

Когда есть только один if..else , производительность почти равна , и это не имеет значения. Используйте то, что лучше всего читается в вашем случае. Но использование вложенных операторов с использованием return является наиболее производительным по сравнению с if...else и case switch

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...