假设我们有六个变量:a,b,c,x,y,z
。
有没有更好的方法来写这个if语句并不那么难读?
if (((!a && !x) || a === x) && ((!b && !y) || b === y) && ((!c && !z) || c === z))
现在让这些变量更长,这段代码会更复杂,更不易读。
答案 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。