? 右侧不能使用 break、continue语句
请注意,不能在三元运算符 ?
中使用不是表达式的语法结构。特别是,像 break
和 continue
这样的指令是不被允许的。
例如,假设我们有以下代码:
if (i > 5) { alert(i); } else { continue; }
如果使用问号(即三元运算符)重写它:
(i > 5) ? alert(i) : continue; // continue isn't allowed here
它将无法运行:会出现语法错误。
这也是不要用问号运算符 ?
替代 if
的另一个原因。
break
/continue
的标签
有时我们需要一次性跳出多个嵌套的循环。
例如,在下面的代码中,我们在 i
和 j
上循环,依次提示输入从 (0,0) 到 (2,2) 的坐标:
for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { let input = prompt(`Value at coords (${i},${j})`, ''); // what if we want to exit from here to Done (below)? } } alert('Done!');
我们需要一种方法在用户取消输入时停止整个流程。
普通的 break
只能跳出内层循环,这是不够的 —— 这时标签就派上用场了!
标签是加在循环前的一个标识符,后面带一个冒号:
labelName: for (...) { ... }
下面循环中的 break <labelName>
语句会跳出到指定的标签处:
outer: for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { let input = prompt(`Value at coords (${i},${j})`, ''); // if an empty string or canceled, then break out of both loops if (!input) break outer; // (*) // do something with the value... } } alert('Done!');
在上面的代码中,break outer
会向上查找名为 outer
的标签,并跳出该循环。
因此,控制流会直接从 (*) 跳转到 alert('Done!')
。
我们也可以将标签放到单独的一行:
outer: for (let i = 0; i < 3; i++) { ... }
continue 指令也可以与标签一起使用。在这种情况下,代码执行会跳转到标记循环的下一次迭代。
标签不允许“跳转”到程序的任何地方
标签不允许我们跳转到代码中的任意位置。
例如,下面的代码是无法实现的:
break label; // jump to the label below (doesn't work) label: for (...)
break
指令必须位于代码块内部。从技术上讲,任何带标签的代码块都可以,例如:
label: { // ... break label; // works // ... }
……不过,99.9% 的情况下,break
都是在循环内部使用的,正如我们在上面的例子中所看到的。
continue
只可能在循环内部使用。
除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!