如何使这个大型if语句在JavaScript中更具可读性
我需要使下面的大型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 ( 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() );
}