5

我是 javascript 的新手,但仍在接受语言的细微差别。

我有一段代码,我必须在其中检查特定变量的一组条件。

if (a=="MAIN_DOMAINNAME" || a=="DOMAIN_SERIAL" || a=="DOMAIN_REFRESH" || a=="DOMAIN_RETRY" || a=="DOMAIN_EXPIRE" || a=="DOMAIN_NEGTTL" || a=="MAIN_NS") {

有没有更好的方法来做这个条件检查,比如:

if a is one of ("DOMAIN_SERIAL", "MAIN_DOMAINNAME", "DOMAIN_REFRESH" ) {?

4

5 回答 5

13

假设一个相对现代的浏览器,你可以使用(spec)Array.indexOf

if (["DOMAIN_SERIAL", "MAIN_DOMAINNAME", "DOMAIN_REFRESH"].indexOf(a) !== -1)

注意 - 您可以轻松地为旧浏览器填充它(请参阅mdn 链接了解如何)。

于 2013-07-26T12:57:18.620 回答
2

正则表达式会更短并且可以在任何地方使用:

if ( /^(MAIN_DOMAINNAME|DOMAIN_SERIAL|DOMAIN_REFRESH|..)$/.test(a) ) {
   // do stuff
}

小提琴

于 2013-07-26T12:58:29.300 回答
1
var ars = ["DOMAIN_SERIAL", "MAIN_DOMAINNAME", "DOMAIN_REFRESH"];
if(ars.some(function(ar){ return a === ar; })){
     // do smth
}
于 2013-07-26T12:58:32.143 回答
1

应该提到 switch 语句,因为它应该与问题中给出的示例一起正常工作。

switch(a) {
  case('MAIN_DOMAINAME'):
  case('DOMAIN_SERIAL'):
  case('DOMAIN_REFRESH'):
  case('DOMAIN_RETRY'):
    console.log('Go wild.');
  break;
}

不像其他答案那么轻巧,但它可读且匹配(a === b)。

于 2013-07-26T13:38:29.647 回答
0

我更喜欢 adeneo 已经提供的正则表达式解决方案,但是如果您想要与

if a is one of (...

问题的措辞相当接近,您可以这样做:

if (a in list("MAIN_DOMAINNAME", "DOMAIN_SERIAL", "DOMAIN_REFRESH", "DOMAIN_RETRY")) {
    // do something                 (rest of list omitted to avoid scrolling)
}

通过提供帮助函数将列表转换为对象:

function list() {
   var o={}, i;
   for (i=0; i < arguments.length; i++) o[arguments[i]] = true;
   return o;
}

当然,您可以省略辅助函数而只使用对象文字,但这很难看:

if (a in {"MAIN_DOMAINNAME":1, "DOMAIN_SERIAL":1, "DOMAIN_REFRESH":1}) {
于 2013-07-26T13:16:25.863 回答