Выход из JavaScript "для" цикла с использованием False?

Я не знал, что это возможно (не так ли?)

Приведенный ниже код, по-видимому, записывает значения от 1 до 5, а затем выходит из цикла "for", поскольку возвращается значение "false".

function x() {
    for (var i = 0; i < 10; i++) {
        console.log(i);
        if (i == 5) return false;
    }
    return true
}

console.log(x());

Мой вопрос:

  • Почему возникают короткие замыкания цикла for, когда возвращается "false"? Я посмотрел на MDN, но там нет ничего об использовании 'false' для выхода из цикла for. Также пытался смотреть на спецификации ECMA, но, к сожалению, слишком нуб.

  • Почему функция не возвращает true в консоль, поскольку оператор return true существует после выполнения цикла for? Даже если false как-то возвращает "first", разве "true" не должно возвращаться последним или также?

5 ответов

Решение

return false не нарушает вашу петлю, но возвращает контроль за спиной.

function x() {
    for (var i = 0; i < 10; i++) {
        console.log(i);
        if (i == 5) return false;
    }
    return true
}

console.log(x())

Выход:

0
1
2
3
4
5
false //here returning false and control also 

куда break сломает ваш цикл вместо выхода из функции.

function x() {
    for (var i = 0; i < 10; i++) {
        console.log(i);
        if (i == 5) break;
    }
    return true
}

console.log(x())

Будет выводить:

0
1
2
3
4
5 //after this loop is breaking and ouputing true
true 

Оператор return завершает функцию, поэтому возвращаемая строка true недоступна. Надеюсь, это поможет.

Приведенный ниже код, по-видимому, записывает значения от 1 до 5, а затем выходит из цикла "for", поскольку возвращается значение "false".

Неправильно, это вырывается из for цикл из-за returnне из-за false, Вы могли бы написать return x с тем же эффектом. Дело в том, return немедленно выпадает из вольера functionлюбой цикл или условие выполняется в настоящее время.

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

const arr = [1,2,3,4,5];

for(let i = 0, isFound; !isFound; i++){
  if(i >= 3 || i >= arr.length){isFound = true;}
  else { console.log(arr[i]);}
}

Таким образом, результат будет:

1
2 
3 

Цикл никогда не будет выполнен до 10. return false вернет управление вызывающей функции x, как только i станет равным 5. return true линия недоступна
Это твой код

function x() {
    for (var i = 0; i < 10; i++) {
        console.log(i);
        if (i == 5) return false;
    }
    return true
}

console.log(x());

Выход:-

 0
 1
 2
 3
 4
 5
 false

Если вы хотите, чтобы оно доходило до возвращаемого истинного утверждения, вы можете сделать что-то вроде добавления break вместо return false в for петля.

for (var i = 0; i < 10; i++) {
            console.log(i);
            if (i == 5) break;//this will put it outside for loop
        }
Другие вопросы по тегам