javascript中如何进行条件判断?_if语句和switch语句该如何选择?【教程】

优先用if处理比较、类型组合、函数调用等逻辑;switch仅适用于同一变量的严格相等匹配且分支≥3个字面量值;需防穿透、避免switch(true)、对象不可作case;Map/对象字面量更适大量映射。

单一条件或范围判断优先用 if,多个离散、确定值的分支优先用 switch;但现代 JS 中 switch 的适用场景其实比想象中更窄。

什么时候必须用 if

当判断逻辑涉及比较运算、布尔表达式、函数调用、或类型不一致时,if 是唯一选择:

  • if (x > 10 && y !== null) —— switch 不支持关系运算符
  • if (typeof data === 'object' && Array.isArray(data)) —— 类型组合判断无法用 switch 拆解
  • if (isValid(input) &&

    hasPermission(user))
    —— 函数返回值作为条件,switch 只能匹配原始值

什么时候 switch 更合适?

仅当所有分支都基于**同一个变量的严格相等(===)匹配**,且分支数量 ≥ 3、值为字符串/数字/布尔字面量时,switch 才有可读性优势:

switch (status) {
  case 'pending':
    showLoading();
    break;
  case 'success':
    renderResult();
    break;
  case 'error':
    showError();
    break;
  default:
    throw new Error(`Unknown status: ${status}`);
}

注意:case 值是运行时求值的,但只做 === 比较;default 不是可选的——漏掉它容易掩盖未处理状态。

switch 容易被忽略的坑

看似简单,但几个细节常导致逻辑错误:

  • 忘记 break → 会“穿透”执行后续 case(哪怕值不匹配),这是最常见 bug 来源
  • switch (true) 是反模式:用 if/else if 更直白,也避免误导他人以为在做值匹配
  • 对象或数组不能作为 case 值:case { id: 1 } 永远不匹配,因为对象比较的是引用
  • V8 引擎对 switch 的优化仅适用于整数或短字符串;长字符串或 Symbol 分支可能反而比 if

现代替代方案:Map 和三元链

面对大量固定键值映射(比如状态码转消息),switch 和长 if/else if 都难维护:

  • Map:适合动态构建或需要复用的映射逻辑,支持任意键类型(包括对象)
  • 用对象字面量:const handlers = { pending: showLoading, success: renderResult } —— 简洁、可枚举、易测试
  • 嵌套三元:type === 'A' ? fnA() : type === 'B' ? fnB() : fnC() —— 仅限 2~3 个分支,过长就失去可读性

真正复杂的条件组合,别硬塞进 ifswitch,拆成独立函数或状态机更可持续。