Подтвердить что ты не робот

Использование 'return' вместо 'else' в JavaScript

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

if(some_condition) {
    // process
    return ;
}

// Continue the else condition here

против

if(some_condition) {
    // Process
}

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 4

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

Ответ 5

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

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

Вот пример 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    
}

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

Проверьте это самостоятельно. Если этот JavaScript запущен в браузере, он почти наверняка будет зависеть от механизма анализа JavaScript браузера.

Ответ 9

Я понимаю, что это не повлияет, потому что вы введете с условием if. Итак, если some_condition истинно, часть else не будет затронута, даже без возврата.

Ответ 10

Предположим, что return занимает 1 мс против вложенного if, принимающего 0,1 мс (или наоборот).

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

Теперь вы делаете это более 100 раз в секунду?

Если это так, возможно, вам все равно.

Ответ 12

Говоря о моих опытах, это зависит от состояния, которое вы проверяете.

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

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

Ответ 13

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