虽然

这个虽然语句创建一个循环,只要测试条件的计算结果为true,该循环就会执行指定的语句。在执行语句之前对条件进行求值。

试试看

语法

js型
虽然 (条件)陈述
条件

计算的表达式之前每个都通过循环。如果出现这种情况计算为true,陈述执行。When条件计算为false,继续执行虽然循环。

陈述

只要条件的计算结果为true就执行的语句。您可以使用块语句执行多条语句。

描述

与其他循环语句一样,您可以使用控制流程表里面陈述:

  • 打破停止陈述执行并转到循环后的第一条语句。
  • 持续停止陈述执行并重新评估条件.

示例

使用while

以下内容虽然循环迭代的长度为n个小于三个。

js型
n个= 0;
x个= 0;

虽然 (n个< ) {n个++;x个+=n个;
}

每次迭代,循环都会增加n个并将其添加到x个.因此,x个n个采用以下值:

  • 第一次通过后:n个=1和x个= 1
  • 第二次通过后:n个=2和x个= 3
  • 第三次通过后:n个=3和x个=6

完成第三遍后,条件n个<3不再成立,因此循环终止。

使用赋值作为条件

在某些情况下,将赋值用作条件是有意义的。这需要在可读性方面进行权衡,因此有一些特定的风格建议,可以使模式对每个人都更加明显。

考虑下面的示例,该示例遍历文档的注释,并将其记录到控制台。

js型
常数迭代器=文件.创建节点标识符(文件,节点筛选器.显示_结算);
当前节点;
虽然 (当前节点=迭代器.next节点()) {慰问.日志(当前节点.text内容.修剪());
}

这并不完全是一个好的实践示例,具体原因如下:

js型
虽然 (当前节点=迭代器.next节点()) {

这个影响该行中的注释节点很好,即每次找到注释节点时:

  1. 迭代器.nextNode()返回该注释节点,该节点被分配给当前节点.
  2. 的价值currentNode=迭代器.nextNode()因此是真实的.
  3. 所以控制台.log()调用执行,循环继续。

…然后,当文档中没有更多注释节点时:

  1. 迭代器.nextNode()收益无效的.
  2. 的价值currentNode=迭代器.nextNode()因此也是无效的,这是虚伪的.
  3. 所以循环结束了。

该行的问题是:通常使用的条件比较运算符例如===,但是=该行中不是比较运算符,而是一个赋值运算符.所以= 看起来像这是一个拼写错误===-即使它是实际上是打字错误。

因此,在这种情况下代码行工具例如ESLint不同意的设计规则-为了帮助您捕获可能的输入错误,以便您可以修复它-将报告如下警告:

应为条件表达式,但看到了赋值。

许多样式指南建议更明确地指示条件作为赋值的意图。您可以通过将附加括号作为分组运算符围绕作业:

js型
常数迭代器=文件.创建节点标识符(文件,节点筛选器.显示_结算);
当前节点;
虽然 ((当前节点=迭代器.next节点())) {慰问.日志(当前节点.text内容.修剪());
}

事实上,这是ESLint的风格不同意的设计的默认配置,以及更漂亮,所以您可能会在野外经常看到这种模式。

有些人可能会进一步建议添加比较运算符,将条件转换为显式比较:

js型
虽然 ((当前节点=迭代器.next节点()) !== 无效的) {

有其他方法可以编写此模式,例如:

js型
虽然 ((当前节点=迭代器.next节点()) &&当前节点) {

或者,放弃使用虽然循环总计:

js型
常数迭代器=文件.创建节点标识符(文件,节点筛选器.显示_结算);
对于 (
  当前节点=迭代器.next节点();当前节点;当前节点=迭代器.next节点()
) {慰问.日志(当前节点.text内容.修剪());
}

如果读者足够熟悉作为条件模式的赋值,那么所有这些变体都应该具有同等的可读性。否则,最后一个表单可能是最可读的,尽管最冗长。

规格

规范
ECMAScript语言规范
#sec-while语句

浏览器兼容性

BCD表仅在浏览器中加载

另请参见