虽然

基线 广泛可用

此功能已得到很好的建立,可在许多设备和浏览器版本中使用。从那时起,它就可以跨浏览器使用了 2015年7月.

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

试试看

设n=0;而(n<3){n++;}控制台.log(n);//预期产量:3

语法

js型
while(条件)陈述
条件

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

陈述

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

描述

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

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

示例

使用while

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

js型
设n=0;设x=0;而(n<3){n++;x+=n;}

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

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

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

使用赋值作为条件

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

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

js型
const迭代器=document.createNodeTerator(document,NodeFilter.SHOW_COMMENT);let currentNode;while(currentNode=迭代器.nextNode()){console.log(currentNode.textContent.trim());}

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

js型
while(currentNode=迭代器.nextNode()){

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

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

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

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

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

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

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

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

js型
const迭代器=document.createNodeTerator(document,NodeFilter.SHOW_COMMENT);让currentNode;while((currentNode=iterator.nextNode())){console.log(currentNode.textContent.trim());}

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

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

js型
while((currentNode=iterator.nextNode())!==空){

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

js型
while((currentNode=iterator.nextNode())&&currentNode){

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

js型
const迭代器=document.createNodeTerator(document,NodeFilter.SHOW_COMMENT);的(让currentNode=迭代器.nextNode();当前节点;currentNode=迭代器.nextNode()) {console.log(currentNode.textContent.trim());}

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

规格

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

浏览器兼容性

另请参见