You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中多值等值判断的if语句有没有更优写法

多值匹配判断的代码优化方案(JavaScript优先)

不同实现方式的效果对比

针对你提到的两种备选方案和原始写法,实际表现差异如下:

  • 原始if多或判断
    if ( num == 0 || num == 20 || num == 32 ) {
     // execute
    }
    
    这是匹配值只有3个时性能最高的写法,没有额外语法开销,缺点是匹配值增加到5个以上时,代码会变得冗长杂乱,后续增删匹配值很容易写错。
  • switch case实现
    switch(num) {
      case 0:
      case 20:
      case 32:
        // 执行逻辑
        break
      default:
        break
    }
    
    性能和原始if几乎没有差异,匹配值稍多的时候结构比堆叠||更清晰,但语法冗余度很高,哪怕只匹配3个值也要写大量case、break关键字,代码性价比很低,不算更优的选择。
  • 手写循环遍历判断
    const targetList = [0, 20, 32]
    let isMatched = false
    for (const val of targetList) {
      if (val == num) {
        isMatched = true
        break
      }
    }
    if (isMatched) {
      // 执行逻辑
    }
    
    仅适合匹配值是动态生成、无法提前枚举的场景。固定值匹配的场景下完全不推荐:3个值的场景下有数组初始化、循环遍历的额外开销,性能比前两种差,代码量也更大,远不如用语言内置的封装方法。

JavaScript 推荐实现

日常业务开发里最通用、维护性最高的写法是用数组的includes方法,和原逻辑的匹配规则基本一致:

if ([0, 20, 32].includes(num)) {
  // 执行逻辑
}

这个写法的优势很明显:

  • 结构简洁,后续增删匹配值只需要修改数组内的元素即可,维护成本极低
  • 现代JS引擎对includes的优化非常成熟,3-10个匹配值的场景下,性能和原始if、switch的差异几乎感知不到,除非是每帧执行上万次的超高频率调用,否则完全不需要考虑性能损耗
  • 天然使用严格相等规则判断,能避免原写法==带来的隐式类型转换bug

如果匹配值超过20个,或者判断逻辑是超高频率执行的场景,推荐用Set实现O(1)时间复杂度的查找,性能比数组includes更高:

// 可以把matchSet提到作用域外部缓存,不需要每次判断都重新初始化
const matchSet = new Set([0, 20, 32 /* 更多匹配值 */])
if (matchSet.has(num)) {
  // 执行逻辑
}

其他语言参考思路

大部分现代编程语言都有类似的内置成员判断语法,不需要手写循环或者冗长的switch:

  • Python:直接用in关键字判断,值多的时候优先用frozenset做O(1)查找:if num in {0, 20, 32}:
  • Java:用静态初始化的Set做判断:if (Set.of(0, 20, 32).contains(num))
  • C#:用扩展方法或者HashSet:if (new [] {0, 20, 32}.Contains(num))

内容的提问来源于stack exchange,提问作者Ryan Jefferson Marinay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:51:22