比较if语句的快捷方式

时间:2015-06-22 07:47:33

标签: javascript

if (Progress.bar.status == 'finished' || Progress.bar.status == 'uploading'){
  //code here
}

如何缩短这个?我想写它而不必重复Progress.bar.status两次。

有些事情:

Progress.bar.status == ('finished' or 'uploading').

4 个答案:

答案 0 :(得分:16)

我喜欢查找表:

if ({finished:1, uploading:1}[Progress.bar.status]){
  //code here
}

这使用一个对象来编码两个或更多选项,甚至是引用每个选项的辅助步骤。它也非常快,因为对象可以被缓存,并且没有比较逻辑或方法来调用,只是快速的属性访问驱动流...

请注意,在某些情况下,您可能希望使用Object.create(null),然后使用您的选项合并/扩展该空白对象,如果您绝对必须避免“hasOwnProperty”,“valueOf”,“ toString“,”toLocaleString“,”构造函数“和一些双下划线扩展。这通常不是问题,但要记住这一点。如果您可以在不提供if这些关键字的情况下生活,或者从Object.create()构建缓存的选择集合,则可以快速而简单地编写“上述”流程之一。

答案 1 :(得分:4)

使用想要的字符串制作数组,应用搜索数组的索引。结果是-1表示未找到,0 ... n表示找到的字符串。为了使这个简短,虽然我们只需要0 ... n结果,但不要对结果应用(https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT) :

value  ~value   boolean
 -1  =>   0  =>  false
  0  =>  -1  =>  true
  1  =>  -2  =>  true
  2  =>  -3  =>  true
  and so on 

在代码中,它们看起来像这样:

if (~['finished', 'uploading'].indexOf(Progress.bar.status)) {
    // code here
}

答案 2 :(得分:4)

我建议使用枚举,然后使用switch()语句:

var Status = {
    Finished: 'finished', 
    Uploading: 'uploading'
};

switch (Progress.bar.status) {
    case Status.Finished:
    case Status.Uploading:
      //code here
      break;
}

最初的代码更多,但更灵活,更易读。

答案 3 :(得分:0)

我知道,扩展本机对象是一个禁忌,但是:

String.prototype.eqOr = function(){
  var i;
  var str = this.toString();
  for(i=0; i< arguments.length; i++){
    if(arguments[i] === str){
      return true;
    }
  }
  return false;
}

if(Progress.bar.status.eqOr('finished', 'uploading')){
   //code here
}

v2.0,谢谢Ja͢ck

String.prototype.eqOr = function(){
   return [].indexOf.call(arguments, this.toString()) !== -1;
}