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

