break和continue语句用于在循环中精确地控制代码的执行。其中,break语句会立即退出循环,强制继续执行循环后面的语句。而continue语句虽然也是立即退出循环,但退出循环后会从循环的顶部继续执行。请看下面的例子:
var num = 0;
for (var i=1; i < 10; i++){
if(i % 5 == 0){
break;
}
num++;
}
alert(num); //4
for循环会将变量i由1递增至10。在循环体内,有一个if语句检查i的值是否可以被5整除,如果是,则执行break语句退出循环。另一方面,变量num从0开始,用于记录循环执行的次数。在执行break语句之后,要执行的下一行代码是alert()函数,结果显示4.也就是说,在变量i等于5时,num++总共执行了4次;而break语句的执行,导致了循环在num再次递增之前就退出了。如果在这里把break替换为continue。则可以看到另一种结果:
var num = 0;
for(var i=1; i < 10; i++){
if(i % 5 == 0){
continue;
}
num++;
}
alert(num); //8
例子的结果显示8,也就是num++总共执行了8次。当变量i等于5时,循环会在num再次递增之前退出,但接下来执行的是下一次循环,即i的值等于6的循环。于是循环又继续执行,直到i等于10时自然结束。而num的最终值之所以是8,是因为continue语句导致它少递增了一次。
break和continue语句都可以与label语句联合使用,从而返回代码中特定的位置。这种联合使用的情况多发生在循环嵌套的情况下,如下面的例子:
var num = 0;
outermost:
for (var i=0; i < 10;i++) {
for(var j=0; j < 10;j++) {
if(i == 5 && j == 5) {
break outermost;
}
num++;
}
}
alert(num); //55
在这个例子中,outermost标签表示外部的for语句。如果每个循环正常执行10次,则num++语句就会正常执行100次。也就是,如果两个循环都自然结束,num的值应该是100.但内部循环中的break语句带了一个参数:要返回到的标签。添加这个标签的结果将导致break语句不仅会退出内部的for语句,而且也会退出外部的for语句。为此,当变量i和j都等于5时,num的值正好是55.同样,continue语句也可以像这样与label语句联用。如下面的例子:
var num = 0;
outermost:
for (var i=0; i < 10; i++) {
for (var j=0; j < 10; j++) {
if(i == 5 && j == 5){
continue outermost;
}
num++;
}
}
alert(num); //95
这种情况下,continue语句会强制继续执行循环——退出内部循环,执行外部循环。当j是5时,continue语句执行,而这也就意味着内部循环少执行了5次所以num的结果是95