学习前提
理解变量、布尔值、比较与类型转换。
本课完成后你能做什么
把规则转换为互斥分支,并用边界输入验证循环是否遗漏或重复。
先理解机制
if 按顺序选择第一个成立的分支,因此范围应先写最严格的条件。&& 与 || 会短路,并返回某个操作数,不保证返回布尔值。?? 只在 null 或 undefined 时取默认值,适合保留0与空字符串。
for 适合索引控制,for...of 读取可迭代对象的值。数组索引从0开始,上界通常是 length 之前而不是包含 length。continue 跳过本轮余下代码,break 结束当前循环;嵌套循环中 break 不会自动结束外层。
循环的正确性可以拆成初始化、每轮保持的事实、结束条件。累计总分时,sum 始终等于已处理有效分数之和;把过滤规则与累加分开写,方便审查。空集合必须单独处理,避免除以0。
可运行示例
const scores = [0, 60, 85, 100, -1];
let sum = 0;
let count = 0;
for (const score of scores) {
if (!Number.isFinite(score) || score < 0 || score > 100) continue;
sum += score;
count += 1;
}
const average = count === 0 ? null : sum / count;
console.log({ sum, count, average });
推演与验证
预期总分245、有效4项、平均61.25。删除所有数据应返回 null;加入字符串60应被排除。逐轮列出 score、sum、count,再对照控制台。
常见错误与边界
while 中忘记更新控制变量会让页面卡住。不要为了让程序继续执行而盲目捕获所有异常;输入不符合规则通常是普通分支,不必抛异常。
动手练习
为平均分增加评级:90及以上A,60及以上B,其余C;没有有效分数显示未评分。测试59.99、60、89.99、90。
参考解法与理由
先处理 null,再由高到低判断范围。若先写 >=60,90也会进入B,后续分支永远无法修正。
function grade(n) {
if (n === null) return "Unrated";
if (n >= 90) return "A";
if (n >= 60) return "B";
return "C";
}