写了三年 JavaScript,我才真正用对 while 和 do-while

39 阅读4分钟



先别急着写代码,我给你讲个故事。有一天,我去逛夜市。夜市门口站着两位门卫

  • 门卫 A:“站住!先检查你有没有票,有票我才让你进去。”
  • 门卫 B:“来都来了,先进来逛一圈再说,出来的时候我再看看你有没有票。”

这两位门卫,看起来只是性格不同,但背后藏着 JavaScript 非常经典的两个循环结构

  • 门卫 A:while
  • 门卫 B:do-while

很多人学 JS 的时候,对这两个语句一带而过:“哦,while 是先判断,do-while 是后判断。”然后就没然后了。

直到有一天你写业务代码、写轮询、写校验、写重试逻辑,bug 开始疯狂敲你脑门,你才发现:“这俩东西,根本不是一回事。”

while:先检查,再干活的“谨慎型选手”

我们先认识门卫 A:while

1、while 的基本语法

一句话总结:条件为 true,才执行;条件为 false,一次都不执行。

就像门卫 A:“没票?对不起,你连夜市的灯都看不到。”

2、一个非常直观的例子

执行结果:

流程是这样的:

  1. 判断 count < 3是否为true
  2. 执行循环体
  3. count++
  4. 再判断
  5. 条件不满足,退出

3、如果一开始条件就是 false 呢?

结果:啥也没有发生, 因为门卫 A 说得很清楚:“不符合条件?那你连门都进不了。”

4、while 的典型使用场景

while 非常适合这种情况:

  • 条件不满足时,一次都不想执行
  • 循环次数不确定
  • 需要先校验状态再行动

比如:

  • 读取缓存,直到拿到有效数据
  • 用户未登录,不执行任何逻辑
  • 队列为空,直接结束处理

这就是典型的“先看看有没有,再决定干不干”。

do-while:先干一把再说的“冲动型选手”

接下来登场的是门卫 B:do-while

1、do-while 的基本语法

注意一个细节:分号不能少!

很多初学者第一次用 do-while,都是被这个分号坑到的。

2、do-while 的核心特性

一句话总结:不管条件如何,先执行一次,再判断是否继续。

门卫 B 的口头禅是:“来都来了,先逛一圈。”

3、最经典的对比示例

输出结果:

哪怕 count < 3 一开始就是 falsedo-while 仍然执行了一次

4、这在现实中像什么?

就像:

  • ATM 机:先让你输一次密码,再告诉你密码对不对
  • 菜单选择:先展示菜单,再判断是否继续
  • 用户输入校验:先让用户输入一次,再检查格式

while vs do-while:掰开揉碎对比一次

我们直接上表格,最清晰:

一句话总结:while:不确定能不能进门do-while:先进门再说

一个真实业务场景的故事

场景:用户输入密码,最多 3 次机会

1、用 while 写(容易写错)

问题来了:input 一开始是 undefined,逻辑并不直观

2、用 do-while 写(非常自然)

这段代码的语义非常清楚

  1. 先让用户输一次
  2. 再判断是否继续
  3. 最多 3 次

这就是 do-while 的主场优势

为什么 do-while 用得少?

这是一个很多人都会问的问题。原因其实很简单:

  1. 大部分业务逻辑不需要“至少执行一次”
  2. while + if 已经能覆盖 90% 场景
  3. do-while 可读性对新手不友好
  4. 容易被忽略的分号

但注意: “用得少”不等于“没用”, do-while 更像一把特定场景下的瑞士军刀

常见坑点合集(血泪经验)

1. 忘了修改条件变量

无限循环,浏览器直接卡死。

2. do-while 后面忘了分号

某些场景下直接报错。

3. 该用 do-while 的地方用了 while

结果就是:用户一次机会都没拿到,体验直接崩

经验总结(掏心窝子)

我在实际开发中遵循一条非常简单的原则:能用 while,就用 while必须先执行一次,才用 do-while

换句话说:

  • 状态驱动 → while
  • 行为驱动 → do-while

别为了“显得高级”去用 do-while,也别因为“平时不用”就忘了它。

END

while 是“先看门票”,而do-while 是“先进来再说”

下次你在写循环的时候,只要在心里问一句:“这段逻辑,能不能一次都不执行?”

答案如果是:

  • 能, while
  • 不能, do-while

你就永远不会选错。

如果你觉得这篇文章对你有点帮助,欢迎点个**「在看」,或者转发给那个总是把 while 写成死循环的同事。**

我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!