判断字符串是否属于集合:逻辑或、includes、Switch哪种更高效?
短字符串集合归属判断的JavaScript效率最优方案
针对你提到的三种判断方式,结合「匹配概率均匀、原数据非数组」的场景,实际性能优先级及分析如下:
1. 最优选择:逻辑或链式判断
if(checkString === 'string1' || checkString === 'someString2' || checkString === 'differentString3' || checkString === 'lol' || checkString === 'jsIsFun' ){doThing();}
- 无任何额外内存开销:不需要创建数组、Set或其他数据结构,直接进行值比较。
- 引擎优化到位:即使匹配概率均匀,这种写法的执行路径最直接,没有额外的方法调用或数据结构初始化成本。
2. 次优选择:Switch语句
switch (checkString) { case 'string1': case 'string2': case 'differentString3': case 'lol': case 'jsIsFun': doThing(); break; }
- 引擎对字符串case有专门优化(如生成跳转表),短集合下和逻辑或的性能差异极小。
- 当后续需要扩展判断的字符串数量时,可读性比长逻辑或链更好。
不推荐:即时创建数组的includes判断
if(['string1', 'string2','differentString3', 'lol', 'jsIsFun'].includes(checkString)){ doThing(); }
- 核心问题:每次判断都会新建一个数组,带来不必要的内存分配与GC压力,频繁调用时累积开销明显。
- 若坚持用includes,必须提前缓存数组(定义在判断逻辑外部),消除重复初始化的成本:
const targetStrings = ['string1', 'string2','differentString3', 'lol', 'jsIsFun']; // 后续判断复用数组 if(targetStrings.includes(checkString)) { doThing(); }
更优扩展方案:Set集合
如果判断逻辑会被频繁调用,或后续可能扩展字符串数量,Set是比数组更高效的选择:
const targetSet = new Set(['string1', 'string2','differentString3', 'lol', 'jsIsFun']); // 判断时调用has() if(targetSet.has(checkString)) { doThing(); }
- Set的
has()方法时间复杂度为O(1),数组includes()为O(n),元素越多性能优势越显著。 - 提前初始化一次Set,同样没有重复创建的开销,代码简洁性也优于逻辑或链。
内容的提问来源于stack exchange,提问作者Aaron Morefield
相关产品推荐
相关产品推荐

