← JavaScript while循环 JavaScript for...of循环 →

JavaScript do-while循环

原创 2026-03-12 JavaScript 已有人查阅

JavaScript do-while循环详解:至少执行一次的保证

在编程的世界里,有时候我们需要确保某段代码至少执行一次,无论条件是否成立。这时候,do-while循环就派上用场了。作为一名在代码号平台上教授编程的开发者,我发现很多学习者对do-while的理解停留在表面,今天我就带你深入探讨这个特殊的循环结构。

什么是do-while循环?

do-while循环是JavaScript中的一种退出控制循环结构。它与while循环的区别在于:do-while循环保证循环体至少执行一次,即使条件从一开始就是false。

从循环的分类来看:

  • 入口控制循环:先判断条件,再执行循环体(如for循环、while循环)

  • 出口控制循环:先执行循环体,再判断条件(如do-while循环)

这种特性在某些业务场景中特别实用,比如用户输入验证、菜单显示等需要至少执行一次操作的场景。

do-while循环的基本语法

do {
    // 要执行的代码块
} while (条件);

语法看起来简单,但执行流程值得深究:

  1. 执行do后面的代码块(不检查任何条件)

  2. 代码块执行完毕后,计算while中的条件表达式

  3. 如果条件为true,重复步骤1;如果为false,退出循环

深入理解do-while的执行机制

让我们通过一个实际的代码号学习场景来理解:

let studyTime = 0;
let targetReached = false;

do {
    studyTime += 30; // 每次学习30分钟
    console.log(`已在代码号学习${studyTime}分钟`);
    
    // 检查是否达到目标学习时间
    if (studyTime >= 120) {
        targetReached = true;
        console.log("完成今日学习目标!");
    }
} while (!targetReached && studyTime < 240);

console.log("学习结束,休息一下吧");

这个例子展示了do-while的特性:即使一开始targetReached就是true,循环体仍然会执行一次。这在需要显示初始状态或执行初始化操作时非常有用。

do-while vs while:选择的关键因素

很多初学者会问:什么时候该用do-while而不是while?根据我的编程经验,这里有几个判断标准:

// 场景1:需要先显示菜单,再根据选择操作
let choice;
do {
    console.log("\n=== 代码号学习菜单 ===");
    console.log("1. JavaScript教程");
    console.log("2. Python教程");
    console.log("3. 退出系统");
    
    // 模拟用户输入(实际开发中来自DOM或命令行)
    choice = Math.floor(Math.random() * 3) + 1;
    console.log(`你选择了:${choice}`);
    
    switch(choice) {
        case 1:
            console.log("打开JavaScript课程...");
            break;
        case 2:
            console.log("打开Python课程...");
            break;
        case 3:
            console.log("感谢使用代码号学习平台");
            break;
    }
} while (choice !== 3);

// 场景2:需要至少验证一次用户输入
let userInput;
do {
    userInput = prompt("请输入一个1-10之间的数字:");
    // 注意:在Node.js环境中,这里需要使用readline模块
    // 这里仅作示例说明
    console.log(`你输入的是:${userInput}`);
} while (userInput < 1 || userInput > 10);

实际应用:使用do-while处理复杂逻辑

让我分享一个在代码号编程课程中经常使用的例子:模拟学习进度追踪系统。

// 学习进度追踪系统
let currentChapter = 1;
let totalChapters = 5;
let masteryLevel = 0;

console.log("开始学习JavaScript课程");

do {
    console.log(`\n开始第${currentChapter}章学习`);
    
    // 模拟学习过程
    let exercisesCompleted = 0;
    let exercisesNeeded = 3;
    
    do {
        exercisesCompleted++;
        console.log(`  完成练习${exercisesCompleted}/${exercisesNeeded}`);
        
        // 随机获取掌握度提升
        let improvement = Math.random() * 20;
        masteryLevel += improvement;
        
    } while (exercisesCompleted < exercisesNeeded);
    
    // 计算本章掌握度
    let chapterMastery = masteryLevel / currentChapter;
    console.log(`第${currentChapter}章掌握度:${chapterMastery.toFixed(2)}%`);
    
    currentChapter++;
    
    // 判断是否继续学习下一章
    // 掌握度低于50%时,建议复习
    if (masteryLevel / (currentChapter - 1) < 50) {
        console.log("建议复习本章内容后再继续");
        let review = prompt("是否复习?(y/n)"); // 实际开发中需要适当处理
        if (review === 'n') {
            break;
        }
    }
    
} while (currentChapter <= totalChapters && masteryLevel < 80);

console.log(`\n学习结束!最终掌握度:${(masteryLevel/totalChapters).toFixed(2)}%`);

do-while与函数式编程的结合

在现代JavaScript开发中,do-while也可以与函数式编程思想结合:

function createStudyPlan(tasks) {
    let taskIndex = 0;
    let results = [];
    
    do {
        let task = tasks[taskIndex];
        console.log(`执行任务:${task.name}`);
        
        // 执行任务并记录结果
        let result = {
            task: task.name,
            duration: task.duration,
            completed: true,
            timestamp: new Date().toISOString()
        };
        
        results.push(result);
        taskIndex++;
        
        // 模拟任务间的休息时间
        if (taskIndex < tasks.length) {
            console.log(`休息5分钟,准备下一个任务`);
        }
        
    } while (taskIndex < tasks.length);
    
    return results;
}

// 使用示例
let dailyTasks = [
    { name: "观看视频教程", duration: 45 },
    { name: "完成练习题", duration: 30 },
    { name: "阅读文档", duration: 20 },
    { name: "编写项目代码", duration: 60 }
];

let studyResults = createStudyPlan(dailyTasks);
console.log("今日学习统计:", studyResults);

处理异步操作的do-while模式

在异步编程中,do-while也有独特的应用场景:

async function fetchWithRetry(maxRetries = 3) {
    let retryCount = 0;
    let data = null;
    let error = null;
    
    do {
        try {
            console.log(`尝试获取数据,第${retryCount + 1}次`);
            
            // 模拟异步API调用
            data = await mockApiCall();
            error = null;
            
        } catch (err) {
            error = err;
            console.log(`第${retryCount + 1}次失败:${err.message}`);
            
            if (retryCount < maxRetries - 1) {
                console.log(`等待${(retryCount + 1) * 1000}ms后重试...`);
                await sleep((retryCount + 1) * 1000);
            }
        }
        
        retryCount++;
        
    } while (error && retryCount < maxRetries);
    
    if (data) {
        console.log("✔ 数据获取成功");
        return data;
    } else {
        console.log("✘ 所有重试都失败了");
        return null;
    }
}

// 辅助函数
function mockApiCall() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // 随机成功或失败
            Math.random() > 0.7 
                 resolve({ id: 1, content: "学习资料" })
                : reject(new Error("网络超时"));
        }, 500);
    });
}

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

do-while循环的注意事项

基于多年的开发和教学经验,使用do-while时需要注意以下几点:

  1. 避免无限循环:确保循环条件最终会变为false

  2. 性能考虑:在循环体内避免执行过于复杂的操作

  3. 作用域管理:注意变量的作用范围

  4. 错误处理:在循环体内添加适当的错误处理机制

本节课程知识要点

掌握do-while循环需要理解的核心概念:

  • 执行保证:无论条件如何,循环体至少执行一次

  • 退出时机:在循环体执行完毕后检查条件

  • 适用场景:用户输入验证、菜单显示、重试机制

  • 变量更新:确保循环条件相关的变量在循环体内被更新

  • 嵌套使用:可以嵌套他循环结构,但要注意复杂度

do-while循环虽然不像for循环那样常用,但在特定场景下却有着不可替代的作用。作为代码号学习平台的开发者,我建议你在实际项目中多加练习,体会不同循环结构的适用场景。编程不仅仅是语法的堆砌,更重要的是理解每种工具的设计哲学和使用场景。

← JavaScript while循环 JavaScript for...of循环 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号