首页 > 技术文章 > js的break与continue

hmy-666 2021-03-17 23:09 原文

例子1:brak与continue的差别:(这个编辑器真难受,只要先写了代码,上面就无法插入换行)
let count = 0; let count2 = 0 for(let i =0;i<9;i++){ for(let j =0;j<8;j++){ count++ if(j==5){//到达5时终止 break; } console.log(count) } } for(let i =0;i<9;i++){ for(let j =0;j<8;j++){ count2++ if(j==5){ continue;//到达5时跳过 } console.log(count2) } }
> 1
> 2
> 3
> 4
> 5
> 7
> 8
> 9
> 10
> 11
> 13
> 14
> 15
> 16
> 17
> 19
> 20
> 21
> 22
> 23
> 25
> 26
> 27
> 28
> 29
> 31
> 32
> 33
> 34
> 35
> 37
> 38
> 39
> 40
> 41
> 43
> 44
> 45
> 46
> 47
> 49
> 50
> 51
> 52
> 53
> "___________________________"break终止下级循环,continue跳出本次循环
> 1
> 2
> 3
> 4
> 5
> 7
> 8
> 9
> 10
> 11
> 12
> 13
> 15
> 16
> 17
> 18
> 19
> 20
> 21
> 23
> 24
> 25
> 26
> 27
> 28
> 29
> 31
> 32
> 33
> 34
> 35
> 36
> 37
> 39
> 40
> 41
> 42
> 43
> 44
> 45
> 47
> 48
> 49
> 50
> 51
> 52
> 53
> 55
> 56
> 57
> 58
> 59
> 60
> 61
> 63
> 64
> 65
> 66
> 67
> 68
> 69
> 71
> 72

 

例子2:没有break应该输出216个,因为3*9*8=216,在第五次break时,会结束最里面第五次的循环

let count = 0;
for(let ii =0;ii<3;ii++){
  for(let i =0;i<9;i++){
  for(let j =0;j<8;j++){
    count++
    if(j==5){
      break;
    }
    console.log(count)
  }
}
}

> 1 > 2 > 3 > 4 > 5 > 7 > 8 > 9 > 10 > 11 > 13 > 14 > 15 > 16 > 17 > 19 > 20 > 21 > 22 > 23 > 25 > 26 > 27 > 28 > 29 > 31 > 32 > 33 > 34 > 35 > 37 > 38 > 39 > 40 > 41 > 43 > 44 > 45 > 46 > 47 > 49 > 50 > 51 > 52 > 53 > 55 > 56 > 57 > 58 > 59 > 61 > 62 > 63 > 64 > 65 > 67 > 68 > 69 > 70 > 71 > 73 > 74 > 75 > 76 > 77 > 79 > 80 > 81 > 82 > 83 > 85 > 86 > 87 > 88 > 89 > 91 > 92 > 93 > 94 > 95 > 97 > 98 > 99 > 100 > 101 > 103 > 104 > 105 > 106 > 107 > 109 > 110 > 111 > 112 > 113 > 115 > 116 > 117 > 118 > 119 > 121 > 122 > 123 > 124 > 125 > 127 > 128 > 129 > 130 > 131 > 133 > 134 > 135 > 136 > 137 > 139 > 140 > 141 > 142 > 143 > 145 > 146 > 147 > 148 > 149 > 151 > 152 > 153 > 154 > 155 > 157 > 158 > 159 > 160 > 161

上面运算结果是:3*9*6-1=161,因为遇到j==5时count没有输出,减少了一次。为什么count是*6而不是5呢,不是5被break了吗,是的的确被break了,但是,count在break之前已经++了,如果把count换个位置就是*5了

let count = 0;
for(let ii =0;ii<3;ii++){
  for(let i =0;i<9;i++){
  for(let j =0;j<8;j++){
    
    if(j==5){
      break;
    }
    count++
    console.log(count)
  }
}
}

> 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > 16 > 17 > 18 > 19 > 20 > 21 > 22 > 23 > 24 > 25 > 26 > 27 > 28 > 29 > 30 > 31 > 32 > 33 > 34 > 35 > 36 > 37 > 38 > 39 > 40 > 41 > 42 > 43 > 44 > 45 > 46 > 47 > 48 > 49 > 50 > 51 > 52 > 53 > 54 > 55 > 56 > 57 > 58 > 59 > 60 > 61 > 62 > 63 > 64 > 65 > 66 > 67 > 68 > 69 > 70 > 71 > 72 > 73 > 74 > 75 > 76 > 77 > 78 > 79 > 80 > 81 > 82 > 83 > 84 > 85 > 86 > 87 > 88 > 89 > 90 > 91 > 92 > 93 > 94 > 95 > 96 > 97 > 98 > 99 > 100 > 101 > 102 > 103 > 104 > 105 > 106 > 107 > 108 > 109 > 110 > 111 > 112 > 113 > 114 > 115 > 116 > 117 > 118 > 119 > 120 > 121 > 122 > 123 > 124 > 125 > 126 > 127 > 128 > 129 > 130 > 131 > 132 > 133 > 134 > 135  

答案为3*9*5=135

 

例子3:每次到达5时终止,下层循环被打断,不会往下执行了,但是上层循环会继续,所以3*5*8=120次,count加了120次

let count = 0;

for(let ii =0;ii<3;ii++){
  for(let i =0;i<9;i++){
    if(i==5){
      break;
    }
  for(let j =0;j<8;j++){
    count++
    
    console.log(count)
  }
}
}

> 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > 16 > 17 > 18 > 19 > 20 > 21 > 22 > 23 > 24 > 25 > 26 > 27 > 28 > 29 > 30 > 31 > 32 > 33 > 34 > 35 > 36 > 37 > 38 > 39 > 40 > 41 > 42 > 43 > 44 > 45 > 46 > 47 > 48 > 49 > 50 > 51 > 52 > 53 > 54 > 55 > 56 > 57 > 58 > 59 > 60 > 61 > 62 > 63 > 64 > 65 > 66 > 67 > 68 > 69 > 70 > 71 > 72 > 73 > 74 > 75 > 76 > 77 > 78 > 79 > 80 > 81 > 82 > 83 > 84 > 85 > 86 > 87 > 88 > 89 > 90 > 91 > 92 > 93 > 94 > 95 > 96 > 97 > 98 > 99 > 100 > 101 > 102 > 103 > 104 > 105 > 106 > 107 > 108 > 109 > 110 > 111 > 112 > 113 > 114 > 115 > 116 > 117 > 118 > 119 > 120

 

例子4:continue

let count = 0;

for(let ii =0;ii<3;ii++){
  for(let i =0;i<9;i++){
    if(i==5){
      continue;//本次等于5时则跳过
    }
  for(let j =0;j<8;j++){
    count++
    
    console.log(count)
  }
}
}

> 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > 16 > 17 > 18 > 19 > 20 > 21 > 22 > 23 > 24 > 25 > 26 > 27 > 28 > 29 > 30 > 31 > 32 > 33 > 34 > 35 > 36 > 37 > 38 > 39 > 40 > 41 > 42 > 43 > 44 > 45 > 46 > 47 > 48 > 49 > 50 > 51 > 52 > 53 > 54 > 55 > 56 > 57 > 58 > 59 > 60 > 61 > 62 > 63 > 64 > 65 > 66 > 67 > 68 > 69 > 70 > 71 > 72 > 73 > 74 > 75 > 76 > 77 > 78 > 79 > 80 > 81 > 82 > 83 > 84 > 85 > 86 > 87 > 88 > 89 > 90 > 91 > 92 > 93 > 94 > 95 > 96 > 97 > 98 > 99 > 100 > 101 > 102 > 103 > 104 > 105 > 106 > 107 > 108 > 109 > 110 > 111 > 112 > 113 > 114 > 115 > 116 > 117 > 118 > 119 > 120 > 121 > 122 > 123 > 124 > 125 > 126 > 127 > 128 > 129 > 130 > 131 > 132 > 133 > 134 > 135 > 136 > 137 > 138 > 139 > 140 > 141 > 142 > 143 > 144 > 145 > 146 > 147 > 148 > 149 > 150 > 151 > 152 > 153 > 154 > 155 > 156 > 157 > 158 > 159 > 160 > 161 > 162 > 163 > 164 > 165 > 166 > 167 > 168 > 169 > 170 > 171 > 172 > 173 > 174 > 175 > 176 > 177 > 178 > 179 > 180 > 181 > 182 > 183 > 184 > 185 > 186 > 187 > 188 > 189 > 190 > 191 > 192

 

上面总结出:continue适用于跳过某次特殊值的循环,但是不打断循环;但是break属于打断下层循环,下面都不执行了,但是上层循环会继续。所以break不能理解为跳出几层循环,应该说它是打破下级循环,只要碰到break,下级循环就终止,但是上层循环会继续,此时又会break。

 

例子5:

let count = 0;
let count2 = 0
for(let ii =0;ii<3;ii++){
  for(let i =0;i<9;i++){
    if(i==5){
     return;
    }
  for(let j =0;j<8;j++){
    count++
    
    console.log(count)
  }
}
}

> 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > 16 > 17 > 18 > 19 > 20 > 21 > 22 > 23 > 24 > 25 > 26 > 27 > 28 > 29 > 30 > 31 > 32 > 33 > 34 > 35 > 36 > 37 > 38 > 39 > 40

return比break还要严格,只要遇到它,上级下级循环都要结束,遇到它就是程序的终结。

 

6.用最后一个例子来终结continue,break,return;

(1)break:会break多次,break次数看它的上一级的循环:

let count = 0;
 let break_count = 0
for(let ii =0;ii<3;ii++){
  for(let i =0;i<9;i++){
    if(i==5){
      break_count++;//break3次,因为外层循环为3
      
      break;
    }
  for(let j =0;j<8;j++){
    count++
    console.log(count)
  }
}
}
console.log("我是break,我总共break了"+break_count+"次")

> 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > 16 > 17 > 18 > 19 > 20 > 21 > 22 > 23 > 24 > 25 > 26 > 27 > 28 > 29 > 30 > 31 > 32 > 33 > 34 > 35 > 36 > 37 > 38 > 39 > 40 > 41 > 42 > 43 > 44 > 45 > 46 > 47 > 48 > 49 > 50 > 51 > 52 > 53 > 54 > 55 > 56 > 57 > 58 > 59 > 60 > 61 > 62 > 63 > 64 > 65 > 66 > 67 > 68 > 69 > 70 > 71 > 72 > 73 > 74 > 75 > 76 > 77 > 78 > 79 > 80 > 81 > 82 > 83 > 84 > 85 > 86 > 87 > 88 > 89 > 90 > 91 > 92 > 93 > 94 > 95 > 96 > 97 > 98 > 99 > 100 > 101 > 102 > 103 > 104 > 105 > 106 > 107 > 108 > 109 > 110 > 111 > 112 > 113 > 114 > 115 > 116 > 117 > 118 > 119 > 120 > "我是break,我总共break了3次"

 

let count = 0;
 let break_count = 0
for(let ii =0;ii<3;ii++){
  for(let i =0;i<9;i++){
  for(let j =0;j<8;j++){
      if(j==5){
      break_count++;//break27次因为外层循环为3*9
      
      break;
    }
    count++
    console.log(count)
  }
}
}
console.log("我是break,我总共break了"+break_count+"次")

> 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > 16 > 17 > 18 > 19 > 20 > 21 > 22 > 23 > 24 > 25 > 26 > 27 > 28 > 29 > 30 > 31 > 32 > 33 > 34 > 35 > 36 > 37 > 38 > 39 > 40 > 41 > 42 > 43 > 44 > 45 > 46 > 47 > 48 > 49 > 50 > 51 > 52 > 53 > 54 > 55 > 56 > 57 > 58 > 59 > 60 > 61 > 62 > 63 > 64 > 65 > 66 > 67 > 68 > 69 > 70 > 71 > 72 > 73 > 74 > 75 > 76 > 77 > 78 > 79 > 80 > 81 > 82 > 83 > 84 > 85 > 86 > 87 > 88 > 89 > 90 > 91 > 92 > 93 > 94 > 95 > 96 > 97 > 98 > 99 > 100 > 101 > 102 > 103 > 104 > 105 > 106 > 107 > 108 > 109 > 110 > 111 > 112 > 113 > 114 > 115 > 116 > 117 > 118 > 119 > 120 > 121 > 122 > 123 > 124 > 125 > 126 > 127 > 128 > 129 > 130 > 131 > 132 > 133 > 134 > 135 > "我是break,我总共break了27次"

 

(2)continue:

let count = 0;
 let continue_count = 0
for(let ii =0;ii<3;ii++){
  for(let i =0;i<9;i++){
     if(i==5){
      continue_count++;//continue3次因为外层循环为3
      
      continue;
    }
  for(let j =0;j<8;j++){
     
    count++
    console.log(count)
  }
}
}
console.log("我是continue,我总共continue了"+continue_count+"次")

> 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > 16 > 17 > 18 > 19 > 20 > 21 > 22 > 23 > 24 > 25 > 26 > 27 > 28 > 29 > 30 > 31 > 32 > 33 > 34 > 35 > 36 > 37 > 38 > 39 > 40 > 41 > 42 > 43 > 44 > 45 > 46 > 47 > 48 > 49 > 50 > 51 > 52 > 53 > 54 > 55 > 56 > 57 > 58 > 59 > 60 > 61 > 62 > 63 > 64 > 65 > 66 > 67 > 68 > 69 > 70 > 71 > 72 > 73 > 74 > 75 > 76 > 77 > 78 > 79 > 80 > 81 > 82 > 83 > 84 > 85 > 86 > 87 > 88 > 89 > 90 > 91 > 92 > 93 > 94 > 95 > 96 > 97 > 98 > 99 > 100 > 101 > 102 > 103 > 104 > 105 > 106 > 107 > 108 > 109 > 110 > 111 > 112 > 113 > 114 > 115 > 116 > 117 > 118 > 119 > 120 > 121 > 122 > 123 > 124 > 125 > 126 > 127 > 128 > 129 > 130 > 131 > 132 > 133 > 134 > 135 > 136 > 137 > 138 > 139 > 140 > 141 > 142 > 143 > 144 > 145 > 146 > 147 > 148 > 149 > 150 > 151 > 152 > 153 > 154 > 155 > 156 > 157 > 158 > 159 > 160 > 161 > 162 > 163 > 164 > 165 > 166 > 167 > 168 > 169 > 170 > 171 > 172 > 173 > 174 > 175 > 176 > 177 > 178 > 179 > 180 > 181 > 182 > 183 > 184 > 185 > 186 > 187 > 188 > 189 > 190 > 191 > 192 > "我是continue,我总共continue了3次"

let count = 0;
 let continue_count = 0
for(let ii =0;ii<3;ii++){
  for(let i =0;i<9;i++){
  for(let j =0;j<8;j++){
       if(j==5){
      continue_count++;//continue27次因为外层循环为3*9
      
      continue;
    }
    count++
    console.log(count)
  }
}
}
console.log("我是continue,我总共continue了"+continue_count+"次")

> 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > 16 > 17 > 18 > 19 > 20 > 21 > 22 > 23 > 24 > 25 > 26 > 27 > 28 > 29 > 30 > 31 > 32 > 33 > 34 > 35 > 36 > 37 > 38 > 39 > 40 > 41 > 42 > 43 > 44 > 45 > 46 > 47 > 48 > 49 > 50 > 51 > 52 > 53 > 54 > 55 > 56 > 57 > 58 > 59 > 60 > 61 > 62 > 63 > 64 > 65 > 66 > 67 > 68 > 69 > 70 > 71 > 72 > 73 > 74 > 75 > 76 > 77 > 78 > 79 > 80 > 81 > 82 > 83 > 84 > 85 > 86 > 87 > 88 > 89 > 90 > 91 > 92 > 93 > 94 > 95 > 96 > 97 > 98 > 99 > 100 > 101 > 102 > 103 > 104 > 105 > 106 > 107 > 108 > 109 > 110 > 111 > 112 > 113 > 114 > 115 > 116 > 117 > 118 > 119 > 120 > 121 > 122 > 123 > 124 > 125 > 126 > 127 > 128 > 129 > 130 > 131 > 132 > 133 > 134 > 135 > 136 > 137 > 138 > 139 > 140 > 141 > 142 > 143 > 144 > 145 > 146 > 147 > 148 > 149 > 150 > 151 > 152 > 153 > 154 > 155 > 156 > 157 > 158 > 159 > 160 > 161 > 162 > 163 > 164 > 165 > 166 > 167 > 168 > 169 > 170 > 171 > 172 > 173 > 174 > 175 > 176 > 177 > 178 > 179 > 180 > 181 > 182 > 183 > 184 > 185 > 186 > 187 > 188 > 189 > "我是continue,我总共continue了27次"

 

总结1,2:你可能会给出continue与break执行相同次数的答案,但是事实却不是这样子的,可以看看下面例子,相同代码使用break与continue执行次数:

let count = 0;
 let continue_count = 0
for(let ii =0;ii<3;ii++){
  for(let i =0;i<9;i++){
  for(let j =0;j<8;j++){
        if(i==5){
      continue_count++;//注意,此处下标为i,continue24次因为外层循环为3,加上i等于5的情况下会在这里遇到8次,即此处循环次数,所以3 * 8 = 24
      
      continue;
    }
    count++
    console.log(count)
  }
}
}
console.log("我是continue,我总共continue了"+continue_count+"次")

> 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > 16 > 17 > 18 > 19 > 20 > 21 > 22 > 23 > 24 > 25 > 26 > 27 > 28 > 29 > 30 > 31 > 32 > 33 > 34 > 35 > 36 > 37 > 38 > 39 > 40 > 41 > 42 > 43 > 44 > 45 > 46 > 47 > 48 > 49 > 50 > 51 > 52 > 53 > 54 > 55 > 56 > 57 > 58 > 59 > 60 > 61 > 62 > 63 > 64 > 65 > 66 > 67 > 68 > 69 > 70 > 71 > 72 > 73 > 74 > 75 > 76 > 77 > 78 > 79 > 80 > 81 > 82 > 83 > 84 > 85 > 86 > 87 > 88 > 89 > 90 > 91 > 92 > 93 > 94 > 95 > 96 > 97 > 98 > 99 > 100 > 101 > 102 > 103 > 104 > 105 > 106 > 107 > 108 > 109 > 110 > 111 > 112 > 113 > 114 > 115 > 116 > 117 > 118 > 119 > 120 > 121 > 122 > 123 > 124 > 125 > 126 > 127 > 128 > 129 > 130 > 131 > 132 > 133 > 134 > 135 > 136 > 137 > 138 > 139 > 140 > 141 > 142 > 143 > 144 > 145 > 146 > 147 > 148 > 149 > 150 > 151 > 152 > 153 > 154 > 155 > 156 > 157 > 158 > 159 > 160 > 161 > 162 > 163 > 164 > 165 > 166 > 167 > 168 > 169 > 170 > 171 > 172 > 173 > 174 > 175 > 176 > 177 > 178 > 179 > 180 > 181 > 182 > 183 > 184 > 185 > 186 > 187 > 188 > 189 > 190 > 191 > 192 > "我是continue,我总共continue了24次"

let count = 0;
 let break_count = 0
for(let ii =0;ii<3;ii++){
  for(let i =0;i<9;i++){
  for(let j =0;j<8;j++){
        if(i==5){
      break_count++;//注意,此处下标为i,break3次因为外层循环为3,i位于j的上级,只要break了i,下级j就不会执行。根据上级ii决定i的break次数
      
      break;
    }
    count++
    console.log(count)
  }
}
}
console.log("我是break,我总共break了"+break_count +"次")

> 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > 16 > 17 > 18 > 19 > 20 > 21 > 22 > 23 > 24 > 25 > 26 > 27 > 28 > 29 > 30 > 31 > 32 > 33 > 34 > 35 > 36 > 37 > 38 > 39 > 40 > 41 > 42 > 43 > 44 > 45 > 46 > 47 > 48 > 49 > 50 > 51 > 52 > 53 > 54 > 55 > 56 > 57 > 58 > 59 > 60 > 61 > 62 > 63 > 64 > 65 > 66 > 67 > 68 > 69 > 70 > 71 > 72 > 73 > 74 > 75 > 76 > 77 > 78 > 79 > 80 > 81 > 82 > 83 > 84 > 85 > 86 > 87 > 88 > 89 > 90 > 91 > 92 > 93 > 94 > 95 > 96 > 97 > 98 > 99 > 100 > 101 > 102 > 103 > 104 > 105 > 106 > 107 > 108 > 109 > 110 > 111 > 112 > 113 > 114 > 115 > 116 > 117 > 118 > 119 > 120 > 121 > 122 > 123 > 124 > 125 > 126 > 127 > 128 > 129 > 130 > 131 > 132 > 133 > 134 > 135 > 136 > 137 > 138 > 139 > 140 > 141 > 142 > 143 > 144 > 145 > 146 > 147 > 148 > 149 > 150 > 151 > 152 > 153 > 154 > 155 > 156 > 157 > 158 > 159 > 160 > 161 > 162 > 163 > 164 > 165 > 166 > 167 > 168 > 169 > 170 > 171 > 172 > 173 > 174 > 175 > 176 > 177 > 178 > 179 > 180 > 181 > 182 > 183 > 184 > 185 > 186 > 187 > 188 > 189 > 190 > 191 > 192 > "我是break,我总共break了3次"

所以总结:

(1)continue与break都会执行多次。

(2)但是break执行的次数根据它所在的定义位置爸爸的循环或者它所在的定义位置的爸爸以及爷爷的循环决定(以此往上推);(i所在定义位置为第二层,所以他的爸爸是ii所在的层)

(3)continue次数由本身所处的位置(这里的本身所处位置是实际所处位置,例如上面的 i 是处于 里面的,所以此处 i 本身位置为 j 循环内部 )与其爸爸决定或者本身所处位置以及他爸爸以及爷爷决定(以此往上推)

最后来个最简单的return结尾:

let count = 0;
 let return_count = 0
 function a (){
for(let ii =0;ii<3;ii++){
  for(let i =0;i<9;i++){
  for(let j =0;j<8;j++){
        if(i==3){
      return_count++;
      
      return 0 ;
    }
    count++
    console.log(count)
  }
}
}
 }
a()
console.log("我是return,不管在哪里,我都是return  "+return_count +"  次")

> 1

> 2
> 3
> 4
> 5
> 6
> 7
> 8
> 9
> 10
> 11
> 12
> 13
> 14
> 15
> 16
> 17
> 18
> 19
> 20
> 21
> 22
> 23
> 24
> 我是return,不管在哪里,我都是return 1 次

推荐阅读