问题
I didn't know this was possible (is it?)
The below code apparently logs values 1 to 5, then breaks out of the 'for' loop, because the 'false' value is returned.
function x() {
for (var i = 0; i < 10; i++) {
console.log(i);
if (i == 5) return false;
}
return true
}
console.log(x());
My question is:
How come the for loop short-circuits when 'false' is returned? I looked at MDN but there is nothing there about using 'false' to break out of the for loop. Also tried looking at ECMA specs, but sadly too noob.
Why doesn't the function return 'true' to the console, as the 'return true' statement exists after the 'for' loop is executed? Even if false somehow returns 'first', shouldn't 'true' return last or also?
回答1:
return false
is not breaking your loop but returning control outside back.
function x() {
for (var i = 0; i < 10; i++) {
console.log(i);
if (i == 5) return false;
}
return true
}
console.log(x())
Output:
0
1
2
3
4
5
false //here returning false and control also
Where break
will break your loop instead of coming out from function.
function x() {
for (var i = 0; i < 10; i++) {
console.log(i);
if (i == 5) break;
}
return true
}
console.log(x())
Will output:
0
1
2
3
4
5 //after this loop is breaking and ouputing true
true
回答2:
The return statement ends the function , so the return true line is unreachable. Hope that helps.
回答3:
The below code apparently logs values 1 to 5, then breaks out of the 'for' loop, because the 'false' value is returned.
Wrong, it breaks out of the for
loop because of the return
, not because of the false
. You could write return x
with the same effect. Point is, return
immediatly drops out of the enclosing function
, whatever loop or conditional is being executed currently.
回答4:
The loop will never be executed till 10. return false
will return control to caller of the function x as soon as i is equal to 5. The return true
line is unreachable.
This is your code
function x() {
for (var i = 0; i < 10; i++) {
console.log(i);
if (i == 5) return false;
}
return true
}
console.log(x());
Output:-
0
1
2
3
4
5
false
If you want it reach to the return true statement you may want to do something like adding a break
instead of return false
in for
loop.
for (var i = 0; i < 10; i++) {
console.log(i);
if (i == 5) break;//this will put it outside for loop
}
回答5:
If you do not want mess with return or break statements, you can add just one boolean flag. In my example i use isFound flag to run loop until your requirements are meet or end of array.
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]);}
}
So the output will be:
1
2
3
来源:https://stackoverflow.com/questions/32942567/breaking-out-of-javascript-for-loop-using-false