Использование оператора Break против раннего возврата при выходе из блока цикла for-of в JavaScript

У меня есть цикл for of, из которого мне нужно выйти, если нет результирующих значений. Мне приходит в голову, что я мог бы использовать ранний оператор return для обработки этого или использовать оператор break. Чтобы было ясно, в этом случае нет дополнительного кода для выполнения ВНУТРИ этого блока кода после части, которую я пропускаю, поэтому я предполагаю, что любой из них будет работать здесь (прерывать или возвращать). Любая функциональная или производительная причина для использования одного над другим в этом конкретном случае?

ВАРИАНТ 1: (перерыв)

  for (let diff of differences) {
    if (!diff.path) break;

    if (diff.path[0] !== "updatedAt") {
      const docChange = new ChangedProp(doc, diff, lastEditedBy, "customer");
      docChange.log();
    }
  }

ВАРИАНТ 2: (возврат)

  for (let diff of differences) {
    if (!diff.path) return;

    if (diff.path[0] !== "updatedAt") {
      const docChange = new ChangedProp(doc, diff, lastEditedBy, "customer");
      docChange.log();
    }
  }

person Rey    schedule 05.06.2019    source источник
comment
Я подозреваю, что это не имеет никакого значения для производительности, но я бы подумал с точки зрения того, как вы представляете себе, как функция может меняться со временем; один может быть лучше другого, если рассматривать его таким образом.   -  person Pointy    schedule 05.06.2019
comment
Возможный дубликат Разница между операторами Return и Break - в то время как в контексте Java ответ относится и к Javascript.   -  person nbokmans    schedule 05.06.2019
comment
Это справедливое замечание, и в этом случае break, вероятно, будет лучшим выбором.   -  person Rey    schedule 05.06.2019
comment
@nbokmans, это вопрос по JavaScript, а не по Java.   -  person Rey    schedule 05.06.2019
comment
@Ademo, это не имеет значения. Тот факт, что он помечен как Java, не означает, что он не применим к Javascript (в данной ситуации).   -  person nbokmans    schedule 05.06.2019
comment
Я думаю, что это заблуждение. Если бы кто-то искал конкретно ответ JS, он, скорее всего, не нашел бы этот ответ. Они также не могли предположить, что это будет применяться в обоих случаях.   -  person Rey    schedule 05.06.2019
comment
Вопрос в семантике программирования, а не в реализации языка. То, что это function() в javascript и void() в java, не означает, что они не оба метода, нет? Кроме того, это буквально первый результат поиска разницы между break и return.   -  person nbokmans    schedule 05.06.2019
comment
Я думаю, что return передает намерение завершить функцию, тогда как break заставляет программиста задуматься о том, что может произойти после цикла. Я бы использовал break, если вам нужно выполнить очистку после цикла, и return, если я хочу немедленно вернуть результат функции, но это очень субъективно. - Вероятно, он компилируется в тот же код на ассемблере.   -  person Moritz Roessler    schedule 05.06.2019
comment
Но реализации могут различаться между языками программирования, поэтому лично я бы никогда не стал предполагать, что то, что верно для одного языка, верно для другого. Например, я бы не стал предполагать, что то, как Python обрабатывает циклы, обязательно будет эквивалентно JavaScript.   -  person Rey    schedule 05.06.2019


Ответы (1)


Любая функциональная или производительная причина для использования одного над другим в этом конкретном случае?

Нет, если предположить, что цикл for-of — это последнее, что есть в содержащей его функции. Так или иначе, могут быть аргументы стиля, но не функциональные причины или причины производительности.

Очевидно, что если есть код после цикла for-of, использование break приведет к запуску этого кода, а использование return приведет к тому, что этот код будет пропущен. Это существенное функциональное различие:

function a(array) {
  for (const value of array) {
    if (value % 2 == 0) {
      break;
    }
  }
  console.log("This line gets reached");
}
function b(array) {
  for (const value of array) {
    if (value % 2 == 0) {
      return;
    }
  }
  console.log("This line does NOT get reached");
}

const arr = [1, 2, 3];
a(arr);
b(arr);

В этом примере код в a и b одинаков, за исключением того, что a использует break, а b использует return (и текст, записанный в конце, немного отличается).

Однако без этого console.log после цикла функциональной разницы нет.

person T.J. Crowder    schedule 05.06.2019
comment
Согласовано. И поэтому, с точки зрения явности, я думаю, что break здесь лучший вариант, потому что, даже если нет дополнительного кода для запуска сейчас, он может появиться в будущем. - person Rey; 05.06.2019
comment
@Ademo - Да, это полностью суждение, и часто оно зависит от конкретного случая, в зависимости от того, что делает функция. :-) - person T.J. Crowder; 05.06.2019