Day-7-数组和循环

Day 7: 数组和循环

🎯 学习目标

  • 理解数组的概念和用途
  • 掌握 for 循环和 while 循环的使用
  • 学会用数组存储和操作多个数据

💡 核心概念

什么是数组?

数组是一种可以存储多个值的变量。想象一下:

  • 变量 = 一个盒子,只能放一个东西
  • 数组 = 一排有编号的盒子,可以放多个东西
// 变量 - 只能存一个名字
let name = "张三";

// 数组 - 可以存多个名字
let names = ["张三", "李四", "王五"];

为什么需要数组?

  • 批量处理: 一次性存储和操作多个相关数据
  • 简化代码: 避免创建大量重复的变量
  • 数据结构: 是其他复杂数据结构的基础

什么是循环?

循环是重复执行代码的结构。当需要:

  • 遍历数组的每个元素
  • 重复执行某段代码多次
  • 处理类似的数据

📝 基本语法

数组的创建和访问

// 创建数组
let fruits = ["苹果", "香蕉", "橙子"];
let numbers = [1, 2, 3, 4, 5];
let mixed = ["文字", 123, true, null];

// 访问数组元素(索引从 0 开始)
console.log(fruits[0]);  // "苹果" - 第一个元素
console.log(fruits[1]);  // "香蕉" - 第二个元素
console.log(fruits[2]);  // "橙子" - 第三个元素

// 修改数组元素
fruits[0] = "葡萄";
console.log(fruits);  // ["葡萄", "香蕉", "橙子"]

// 获取数组长度
console.log(fruits.length);  // 3

for 循环

// 基本语法
for (初始化; 条件; 更新) {
    // 循环体 - 要重复执行的代码
}

// 示例 1: 打印数字 1-5
for (let i = 1; i <= 5; i++) {
    console.log(i);
}
// 输出: 1, 2, 3, 4, 5

// 示例 2: 遍历数组
let colors = ["红", "黄", "蓝"];
for (let i = 0; i < colors.length; i++) {
    console.log(`颜色 ${i}: ${colors[i]}`);
}
// 输出: 颜色 0: 红, 颜色 1: 黄, 颜色 2: 蓝

while 循环

// 基本语法
while (条件) {
    // 循环体
}

// 示例: 倒计时
let countdown = 5;
while (countdown > 0) {
    console.log(countdown);
    countdown--;
}
// 输出: 5, 4, 3, 2, 1

for…of 循环(遍历数组)

let animals = ["猫", "狗", "鸟"];

for (let animal of animals) {
    console.log("动物: " + animal);
}
// 输出: 动物: 猫, 动物: 狗, 动物: 鸟

🎮 示例代码

示例 1: 计算数组中数字的总和

let scores = [85, 92, 78, 95, 88];
let sum = 0;

// 使用 for 循环求和
for (let i = 0; i < scores.length; i++) {
    sum += scores[i];
    console.log(`第 ${i+1} 门课成绩: ${scores[i]}`);
}

console.log("总分: " + sum);
console.log("平均分: " + (sum / scores.length));

输出:

第 1 门课成绩: 85
第 2 门课成绩: 92
第 3 门课成绩: 78
第 4 门课成绩: 95
第 5 门课成绩: 88
总分: 438
平均分: 87.6

示例 2: 找出数组中的最大值

let numbers = [23, 45, 12, 67, 34, 89, 5];
let max = numbers[0];  // 假设第一个是最大的

for (let i = 1; i < numbers.length; i++) {
    if (numbers[i] > max) {
        max = numbers[i];
        console.log(`发现更大的数字: ${numbers[i]}`);
    }
}

console.log("最大值是: " + max);

示例 3: 筛选数组中的偶数

let allNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let evenNumbers = [];

for (let num of allNumbers) {
    if (num % 2 === 0) {  // 判断是否是偶数
        evenNumbers.push(num);
    }
}

console.log("所有数字: " + allNumbers);
console.log("偶数: " + evenNumbers);

示例 4: 创建一个待办事项列表

// 初始待办列表
let todos = ["写作业", "买菜", "打扫房间"];

// 添加新任务
todos.push("锻炼身体");
todos.push("阅读 30 分钟");

console.log("=== 我的待办事项 ===");

// 显示所有任务
for (let i = 0; i < todos.length; i++) {
    console.log(`${i + 1}. ${todos[i]}`);
}

// 标记完成
console.log("\n完成第 2 个任务: " + todos[1]);
todos.splice(1, 1);  // 删除第 2 个任务

console.log("\n=== 更新后的待办事项 ===");
for (let todo of todos) {
    console.log("• " + todo);
}

输出:

=== 我的待办事项 ===
1. 写作业
2. 买菜
3. 打扫房间
4. 锻炼身体
5. 阅读 30 分钟

完成第 2 个任务: 买菜

=== 更新后的待办事项 ===
• 写作业
• 打扫房间
• 锻炼身体
• 阅读 30 分钟

示例 5: 嵌套循环(乘法表)

console.log("=== 9x9 乘法表 ===");

for (let i = 1; i <= 9; i++) {
    let line = "";
    for (let j = 1; j <= i; j++) {
        line += `${j}×${i}=${i*j} `;
    }
    console.log(line);
}

输出:

=== 9x9 乘法表 ===
1×1=1 
1×2=2 2×2=4 
1×3=3 2×3=6 3×3=9 
1×4=4 2×4=8 3×4=12 4×4=16 
1×5=5 2×5=10 3×5=15 4×5=20 5×5=25 
1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36 
1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49 
1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64 
1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81 

✍️ 练习任务

练习 1: 基础练习

任务: 创建一个存储一周温度的数组

要求:

  1. 定义数组 temperatures = [23, 25, 22, 26, 28, 30, 29]
  2. 用循环打印每天的气温
  3. 计算一周平均温度
  4. 找出最高温度和最低温度

提示:

  • 使用 for 循环遍历数组
  • 用变量保存最大值和最小值
  • 平均温度 = 总和 / 数量

练习 2: 进阶练习

任务: 实现一个简单的购物车

场景:

let products = [
    {name: "苹果", price: 5},
    {name: "牛奶", price: 8},
    {name: "面包", price: 12}
];

let cart = ["苹果", "面包", "面包", "苹果"];

要求:

  1. 遍历购物车,打印每个商品
  2. 计算总价
  3. 统计每种商品的数量

练习 3: 实战应用

任务: 创建一个学生成绩管理系统

数据:

let students = [
    {name: "小明", scores: [85, 90, 88]},
    {name: "小红", scores: [92, 87, 95]},
    {name: "小刚", scores: [78, 85, 82]}
];

要求:

  1. 计算每个学生的平均分
  2. 找出总分最高的学生
  3. 统计所有学生的平均分
  4. 输出格式化的成绩单

输出示例:

=== 成绩单 ===
小明: 平均 87.7
小红: 平均 91.3
小刚: 平均 81.7

最高分: 小红 (总分 274)
班级平均分: 86.9

🎓 今日挑战

挑战任务: 设计一个简单的文字游戏

游戏规则:

  1. 电脑随机生成一个 1-100 的数字
  2. 玩家猜测数字,最多 10 次机会
  3. 每次提示"太大"或"太小"
  4. 记录每次猜测的历史

要求:

  • 使用数组存储猜测历史
  • 用循环控制游戏次数
  • 显示猜测历史和建议
  • 猜中或用完次数后显示结果

示例输出:

=== 猜数字游戏 ===
我已经想好了一个 1-100 的数字,你有 10 次机会!

第 1 次猜测 (50): 太大了!
第 2 次猜测 (25): 太小了!
第 3 次猜测 (37): 太小了!
...

猜测历史: [50, 25, 37, ...]
恭喜你!答案就是 42!

💡 常用数组方法

let nums = [1, 2, 3, 4, 5];

// 添加元素
nums.push(6);        // 末尾添加 -> [1,2,3,4,5,6]
nums.unshift(0);     // 开头添加 -> [0,1,2,3,4,5,6]

// 删除元素
nums.pop();          // 删除末尾 -> [0,1,2,3,4,5]
nums.shift();        // 删除开头 -> [1,2,3,4,5]

// 查找
nums.indexOf(3);     // 返回 3 的索引 (2)
nums.includes(4);    // true - 是否包含 4

// 数组变字符串
nums.join(", ");     // "1, 2, 3, 4, 5"
nums.toString();     // "1,2,3,4,5"

⚠️ 常见错误

错误 1: 数组索引越界

let arr = [1, 2, 3];
console.log(arr[5]);  // undefined - 没有索引 5

错误 2: 循环条件错误

// 错误: 忘记更新变量,变成死循环
let i = 0;
while (i < 5) {
    console.log(i);
    // 忘记 i++ - 会一直打印 0
}

// 正确
while (i < 5) {
    console.log(i);
    i++;  // 记得更新
}

错误 3: 混淆赋值和比较

// 错误: 应该用 === 而不是 =
for (let i = 0; i = 5; i++) {  // 死循环!
    // ...
}

// 正确
for (let i = 0; i < 5; i++) {
    // ...
}

🎯 调试技巧

1. 打印数组

let arr = [1, 2, 3];
console.log(arr);         // [1, 2, 3]
console.log(arr[0]);      // 1
console.log(arr.length);  // 3

2. 循环中的调试

for (let i = 0; i < 5; i++) {
    console.log(`第 ${i} 次循环`);  // 跟踪循环次数
    // 你的代码
}

3. 使用 debugger

let numbers = [1, 2, 3, 4, 5];
debugger;  // 程序会在这里暂停
for (let num of numbers) {
    console.log(num);
}

📚 延伸阅读

  • 下一节: Day 8 – 对象
  • 相关: Day 6 – 数组与对象(本节深入讲解)
  • 进阶: forEach、map、filter 等高阶数组方法

学习时间: 2026-03-08
难度: ⭐⭐⭐☆☆
预计用时: 2-3 小时
关键词: 数组, 循环, for, while
相关标签: #02-变量与数据