先别急着写代码,我给你讲个故事。有一天,我去逛夜市。夜市门口站着两位门卫。
- 门卫 A:“站住!先检查你有没有票,有票我才让你进去。”
- 门卫 B:“来都来了,先进来逛一圈再说,出来的时候我再看看你有没有票。”
这两位门卫,看起来只是性格不同,但背后藏着 JavaScript 非常经典的两个循环结构:
- 门卫 A:while
- 门卫 B:do-while
很多人学 JS 的时候,对这两个语句一带而过:“哦,while 是先判断,do-while 是后判断。”然后就没然后了。
直到有一天你写业务代码、写轮询、写校验、写重试逻辑,bug 开始疯狂敲你脑门,你才发现:“这俩东西,根本不是一回事。”
while:先检查,再干活的“谨慎型选手”
我们先认识门卫 A:while。
1、while 的基本语法
一句话总结:条件为 true,才执行;条件为 false,一次都不执行。
就像门卫 A:“没票?对不起,你连夜市的灯都看不到。”
2、一个非常直观的例子
执行结果:
流程是这样的:
- 判断 count < 3是否为true
- 执行循环体
- count++
- 再判断
- 条件不满足,退出
3、如果一开始条件就是 false 呢?
结果:啥也没有发生, 因为门卫 A 说得很清楚:“不符合条件?那你连门都进不了。”
4、while 的典型使用场景
while 非常适合这种情况:
- 条件不满足时,一次都不想执行
- 循环次数不确定
- 需要先校验状态再行动
比如:
- 读取缓存,直到拿到有效数据
- 用户未登录,不执行任何逻辑
- 队列为空,直接结束处理
这就是典型的“先看看有没有,再决定干不干”。
do-while:先干一把再说的“冲动型选手”
接下来登场的是门卫 B:do-while。
1、do-while 的基本语法
注意一个细节:分号不能少!
很多初学者第一次用 do-while,都是被这个分号坑到的。
2、do-while 的核心特性
一句话总结:不管条件如何,先执行一次,再判断是否继续。
门卫 B 的口头禅是:“来都来了,先逛一圈。”
3、最经典的对比示例
输出结果:
哪怕 count < 3 一开始就是 false,do-while 仍然执行了一次。
4、这在现实中像什么?
就像:
- ATM 机:先让你输一次密码,再告诉你密码对不对
- 菜单选择:先展示菜单,再判断是否继续
- 用户输入校验:先让用户输入一次,再检查格式
while vs do-while:掰开揉碎对比一次
我们直接上表格,最清晰:
一句话总结:while:不确定能不能进门do-while:先进门再说
一个真实业务场景的故事
场景:用户输入密码,最多 3 次机会
1、用 while 写(容易写错)
问题来了:input 一开始是 undefined,逻辑并不直观
2、用 do-while 写(非常自然)
这段代码的语义非常清楚:
- 先让用户输一次
- 再判断是否继续
- 最多 3 次
这就是 do-while 的主场优势。
为什么 do-while 用得少?
这是一个很多人都会问的问题。原因其实很简单:
- 大部分业务逻辑不需要“至少执行一次”
- while + if 已经能覆盖 90% 场景
- do-while 可读性对新手不友好
- 容易被忽略的分号
但注意: “用得少”不等于“没用”, 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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!