在最近与初级JavaScript开发人员的谈话中,我提到了以下用于减少使用OR操作数的费力的if / else块的技术:
if (/^(cat|dog|horse)$/.test(animal)) { ... }
而不是
if (animal == 'cat' || animal == 'dog' || animal == 'horse') { ... }
我从来没有遇到过这个问题,但是有人认为这是一个糟糕的设计模式,没有详细说明原因。
答案 0 :(得分:4)
在我看来,他是想要过于聪明的人。并且,在这样做的过程中,您已经引入了几个新的潜在失败点(在正则表达式语法中),并使代码不那么具有表现力/惯用性。如果你的操作数从'cat'
变为动态或变量,你也会感到挣扎。
通常,在做这样的事情时,我只是引入一个数组:
if (['cat', 'dog', 'horse'].indexOf(animal) != -1) { ... }
老实说,这是可笑的主观所以没有"对"回答我可以给你。
通常在这一点上我会引入性能问题,但由于需要仅扫描一次输入,因此您实际上可能会有更快的解决方案。这将取决于正则表达式本身的解析速度。
答案 1 :(得分:2)
正则表达方式毫无疑问我更喜欢在这种情况下,而不是感谢有很长的比较列表。表现明智,我认为正则表达式不会比多重比较大得多(想象一下你动物的30-40比较的情况)。
正则表达式还为您提供了其他好处,例如检查忽略大小写匹配或与单词边界进行比较(对于这些情况,当输入是某些文本的一部分时),这将需要额外的代码,否则用于字符串比较。
答案 2 :(得分:1)
构建一个正则表达式比进行一些字符串比较更昂贵,但是如果它使代码更清晰并且性能不受影响(当然通过分析!),那么我觉得它很好。 / p>
答案 3 :(得分:0)
这是基于意见的,但有些要提出的要点是:
代码应该是可读的,而不是非常短。
正则表达式更容易出错,例如:如果忘记了$
这将匹配horses
没有文档,有人阅读代码重构代码可能不会有痛苦的目的:
^cat|dog|horse$
^cat|dog|horse
添加更多变种可能会有问题,即:
if (animal == 'cat' || animal == 'dog' || animal == someUserInputtedAnimal)
<强>解决方案:强>
对于许多if语句使用switch或&#34; true&#34;切换:
switch (animal)
{
case 'cat':
break;
case 'dog':
break;
case 'horse':
break;
}
switch (true)
{
case animal == 'cat':
break;
case animal == 'dog':
break;
case animal == 'horse':
break;
case someRandomAnimal == ressurected:
break;
}