控制流语句

控制流语句是 JavaScript 程序执行路径的核心调控机制,通过条件判断、循环迭代和流程跳转实现复杂逻辑。根据执行逻辑可分为三大类:条件语句(if、switch)、循环语句(for、while、do-while)和跳转语句(break、continue、return),这些语句共同构成了程序的执行骨架[3]。

条件语句:if-else 与 switch 的场景化对比

条件语句通过判断表达式真伪决定代码分支,其中 if-else 和 switch 是最常用的实现方式。以下通过"学生成绩评级"案例(分数 0-100 对应 A-E 等级)对比两者的适用场景。

if-else 实现(适合范围判断):

javascript
复制代码
function getGradeWithIf(score) {
  if (score >= 90 && score <= 100) return 'A';
  else if (score >= 80 && score < 90) return 'B';
  else if (score >= 70 && score < 80) return 'C';
  else if (score >= 60 && score < 70) return 'D';
  else if (score >= 0 && score < 60) return 'E';
  else return 'Invalid score';
}

switch 实现(适合固定值匹配):

javascript
复制代码
function getGradeWithSwitch(score) {
  const level = Math.floor(score / 10); // 将分数转换为 0-10 区间整数
  switch (level) {
    case 10:
    case 9: return 'A'; // 合并 90-100 区间
    case 8: return 'B';
    case 7: return 'C';
    case 6: return 'D';
    case 5:
    case 4:
    case 3:
    case 2:
    case 1:
    case 0: return 'E';
    default: return 'Invalid score';
  }
}

核心差异与适用场景

  • if-else:支持范围判断(如 score >= 90)和复杂条件组合(如 score > 80 && attendance === 100%),但多分支时嵌套层级可能影响可读性。
  • switch:通过 case 匹配离散值,适合单变量多状态判断(如枚举值、区间转换后的值),使用 break 避免穿透,多分支时结构更扁平。
  • 性能考量:现代 JS 引擎(如 V8)对 switch 有优化(生成跳转表),在 5+ 分支场景下可能比 if-else 更快;但分支较少时两者差异可忽略。

循环语句与跳转优化:素数判断案例

循环语句用于重复执行代码块,for 循环因初始化、条件判断、迭代器的集成特性,常用于已知循环次数的场景。以"素数判断"(判断正整数 n 是否为素数)为例,演示循环控制流及跳转语句的优化作用。

素数判断逻辑:素数是大于 1 且仅能被 1 和自身整除的整数。常规实现需检查 2 至 n-1 的所有除数,但通过数学优化可缩小至 2 至 √n(若 n 存在非自身因数,必有一个小于等于 √n)。

基础实现

javascript
复制代码
function isPrimeBasic(n) {
  if (n <= 1) return false; // 排除 <=1 的数
  for (let i = 2; i < n; i++) { // 检查 2 至 n-1
    if (n % i === 0) return false; // 找到除数,非素数
  }
  return true;
}

优化实现(引入 break 和数学优化):

javascript
复制代码
function isPrimeOptimized(n) {
  if (n <= 1) return false;
  if (n === 2) return true; // 2 是唯一偶素数
  if (n % 2 === 0) return false; // 排除偶数
  const sqrtN = Math.sqrt(n); // 计算平方根
  for (let i = 3; i <= sqrtN; i += 2) { // 步长 2(仅检查奇数)
    if (n % i === 0) {
      break; // 找到除数,立即退出循环
    }
  }
  return true;
}

跳转语句作用

  • break:终止当前循环并跳出循环体,如素数判断中找到除数后立即退出,避免无效迭代(优化后循环次数从 O(n) 降至 O(√n/2))。
  • continue:跳过当前迭代剩余代码,进入下一次循环(适用于过滤特定情况,如遍历数组时跳过空值)。
  • 注意:break 可用于 for/while/do-while 及 switch,continue 仅用于循环;两者均只影响最内层控制结构。

模式匹配:现代条件判断新范式

ES2023 引入的模式匹配(Pattern Matching)提供了比 switch 更强大的结构化数据匹配能力,尤其适合复杂对象或数组的条件判断。其基础语法通过 match 关键字结合模式解构实现:

javascript
复制代码
// 匹配对象类型并提取属性
const shape = { type: 'circle', radius: 5 };
const area = match (shape) {
  { type: 'circle', radius: r } => Math.PI * r **2, // 匹配圆形并计算面积
  { type: 'rectangle', width: w, height: h } => w * h, // 匹配矩形
  _ => 0 // 默认情况(类似 switch 的 default)
};

模式匹配支持多种模式(如数组模式、值模式、绑定模式),可嵌套使用,大幅简化复杂条件逻辑的代码量。作为 JavaScript 高级特性,其设计理念与函数式编程的解构思想一脉相承,将在后续"函数式编程"章节深入探讨。

控制流语句的合理使用直接影响代码的执行效率与可维护性:条件判断需根据场景选择 if-else 或 switch;循环设计应结合数学优化与跳转语句减少无效计算;而模式匹配则为未来复杂数据结构的处理提供了更优雅的解决方案。