如何使这个大型if语句在JavaScript中更具可读性

如何使这个大型if语句在JavaScript中更具可读性,javascript,Javascript,我需要使下面的大型if语句在JavaScript中更具可读性 有什么想法吗 if ( Tools.Array.contains( that.pAutocompleteAliasUsed[i], this.currentString) !== false && ( this.autocomplete.list.length === 0 ) || ( this.currentString.toLowerCase() !== this.autocomplete.list[0]

我需要使下面的大型if语句在JavaScript中更具可读性

有什么想法吗

if ( Tools.Array.contains( that.pAutocompleteAliasUsed[i], this.currentString) !== false  &&
    ( this.autocomplete.list.length === 0 ) || ( this.currentString.toLowerCase() !== this.autocomplete.list[0].target.alias.toLowerCase() ) )
{
    make something
}

你不能把它缩短,因为你有各种各样的变量。但你能做的是这样的,这使它更具可读性:

var list = this.autocomplete.list,
    currentString = this.currentString,
    containsCurrentString = Tools.Array.contains( that.pAutocompleteAliasUsed[i], currentString);

if ( containsCurrentString !== false  &&
        ( list.length === 0 ) || ( currentString.toLowerCase() !== list[0].target.alias.toLowerCase() ) )
{
    // make something
}


为了使事情更具可读性,可以做的一件事是从if语句中提取各种逻辑测试。在if测试中读取一条语句,然后很好地命名布尔参数,这要容易得多

我在本例中的第一个测试中就这样做了,我也尝试过其他测试,但是您可以比我更好地命名它们,因为您知道它们正在测试什么

var toolsContainsString = Tools.Array.contains(that.pAutocompleteAliasUsed[i], this.currentString) !== false;
var isAutoCompleteEmpty = this.autocomplete.list.length === 0;
var isTargetMatch = this.currentString.toLowerCase() !== this.autocomplete.list[0].target.alias.toLowerCase();

if (toolsContainsString && (isAutoCompleteEmpty || isTargetMatch)) {
    //make something
}

当您进行复杂测试时,最好的做法是:(1)在定义良好的函数中提取测试的部分;(2)为这些函数提供解释函数用途的良好名称

这样,读取方法名就足以理解函数正在执行和返回的操作

 if (isAutoCompleteAliasUsed(i, currentString) 
          && notEmptyOrFirst(this.autocomplete, currentString){
     // make something
 }

 function isAutoCompleteAliasUsed(index, currentString){
     return Tools.Array.contains(that.pAutocompleteAliasUsed[i], currentString);
 }

 function notEmptyOrFirst(autocomplete,currentString){
     return autocomplete.list.length === 0 
        || (currentString.toLowerCase() !== autocomplete.list[0].target.alias.toLowerCase() );
 }

定义“更具可读性”。当前版本存在什么问题?根据您的可行性,有很多方法可以实现
 if( Tools.Array.contains( that.pAutocompleteAliasUsed[i], this.currentString) !== false  &&
        ( this.autocomplete.list.length === 0 ) || 
        ( this.currentString.toLowerCase() !== this.autocomplete.list[0].target.alias.toLowerCase() )
   )
 {
          // something
 }
var toolsContainsString = Tools.Array.contains(that.pAutocompleteAliasUsed[i], this.currentString) !== false;
var isAutoCompleteEmpty = this.autocomplete.list.length === 0;
var isTargetMatch = this.currentString.toLowerCase() !== this.autocomplete.list[0].target.alias.toLowerCase();

if (toolsContainsString && (isAutoCompleteEmpty || isTargetMatch)) {
    //make something
}
 if (isAutoCompleteAliasUsed(i, currentString) 
          && notEmptyOrFirst(this.autocomplete, currentString){
     // make something
 }

 function isAutoCompleteAliasUsed(index, currentString){
     return Tools.Array.contains(that.pAutocompleteAliasUsed[i], currentString);
 }

 function notEmptyOrFirst(autocomplete,currentString){
     return autocomplete.list.length === 0 
        || (currentString.toLowerCase() !== autocomplete.list[0].target.alias.toLowerCase() );
 }