if (Progress.bar.status == 'finished' || Progress.bar.status == 'uploading'){
//code here
}
如何缩短这个?我想写它而不必重复Progress.bar.status
两次。
有些事情:
Progress.bar.status == ('finished' or 'uploading').
答案 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;
}