干 - 如何将这个if语句交换成不太复杂的语句

时间:2013-12-06 09:52:23

标签: javascript if-statement dry

假设我们有六个变量:a,b,c,x,y,z。 有没有更好的方法来写这个if语句并不那么难读?

if (((!a && !x) || a === x) && ((!b && !y) || b === y) && ((!c && !z) || c === z))

现在让这些变量更长,这段代码会更复杂,更不易读。

4 个答案:

答案 0 :(得分:5)

一种显而易见的方法是使重复的代码功能化:

function checkVars(a, b) {
  return !a && !b  ||  a === b;
}

// ...
if (checkVars(a, x) && checkVars(b, y) && checkVars (c, z)) {
// ...
}

正确地提到,你应该给这个函数一个描述性的名字,显示它真正的作用。显然,它检查给定的变量是否是假的或者它们是否相同,所以一个显而易见的选择是falsyOrIdentical。那么你的if陈述将变成真正的自我评论:

if (falsyOrIdentical(a, x) 
 && falsyOrIdentical(b, y) 
 && falsyOrIdentical(c, z)) {

 // here goes the code
} 

如果要检查更多变量,Pavlo的方法(使用slice.call(arguments)技巧的单个函数将所有变量转换为数组,然后应用此函数,直到它使{{1}的此数组的每个元素失败}方法)是最好的。但话说回来,我真的很想知道所有这些变量不应该成为集合的一部分 - 所以你可以立即使用every

答案 1 :(得分:3)

扩展功能方法。比较函数可以用作数组every()方法内的回调。要不将数组作为函数参数传递,我将在call()上使用arguments

function compare() {
  return Array.prototype.every.call(arguments, function (e) {
    return !e[0] && !e[1] || e[0] === e[1];
  });
}

if (compare([a, x], [b, y], [c, z])) {
  // Do something
}

答案 2 :(得分:0)

你应该使用布尔变量来更容易比较。

例如:
!a&& !x可以转换成类似

的东西
var aAndBeIsNotTrue = !a && !x
var bAndYIsNotTrue = !b && !y

如果陈述看起来像

if(aAndBIsNotTrue || a === x) && (bAndYIsNotTrue || b === y)

我认为你明白了。您还可以使用可读名称的新方法,并在这些方法中放置布尔逻辑。这些也可以很好地进行单元测试。

清洁代码书包含有关使用布尔变量来简化复杂的if语句的很好的例子。

答案 3 :(得分:-1)

您好我们可以使用if else梯来解决问题: 这里我使用函数CheckCondition(),返回值为bool。

CheckCondition()
  {
if((!a&&!x)||a==x)
{
if((!b&&!y)||b==y)
{
if((!c&&!z)||c==z)
{
return true;
}
else return false;
}
else return false;
}
else return false;
}

if if条件也可以分解为if else ladder。