请考虑以下switch语句:
let doAttack = (firstAttacker, secondAttacker, statusOfBattle) => {
statusOfBattle = createNonHitMessages(secondAttacker, firstAttacker, statusOfBattle);
switch(statusOfBattle) {
case statusOfBattle.enemyDodged && statusOfBattle.enemyBlocked:
console.log('enemy Attack');
break;
case statusOfBattle.attackerDodged && statusOfBattle.attackerBlocked:
console.log('attacker Attack');
break;
case statusOfBattle.enemyDodged:
console.log('enemy Attack');
break;
case statusOfBattle.enemyBlocked:
console.log('enemey Attack');
break;
case statusOfBattle.attackerBlocked:
console.log('attacker attack');
break;
case statusOfBattle.attackerDodged:
console.log('attacker attack');
break;
default:
break;
}
return statusOfBattle
}
enemeyDodged
,enemeyBlocked
,attackerBlocked
和attackerDodged
将返回true
或false
。
我真的不想写一个巨大的if声明,我没有反对它,除了它在我有这么多条件时看起来不太干净。
如果一个if
语句是唯一的方法,但我希望我可以在这样的switch语句中检查布尔值,这样我就可以保持这个清晰可读。
我显然不明白switch语句的局限性。
有任何想法吗?
这不是switch
的工作原理 - 它在括号中对你的情况进行评估,在你的情况下statusOfBattle
,并执行等于该事物的值的情况。你的陈述与任何情况都不匹配,因为statusOfBattle
的属性不等于statusOfBattle
对象本身。
我不完全了解如何确定攻击者,但无论您是否尝试使用简单的if / else语句和一些逻辑运算符:
let doAttack = (firstAttacker, secondAttacker, statusOfBattle) => {
statusOfBattle = createNonHitMessages(secondAttacker, firstAttacker, statusOfBattle);
if (statusOfBattle.attackerDodged && !statusOfBattle.enemyBlocked) {
return 'attacker attack';
} else if (statusOfBattle.attackerBlocked) {
return 'attacker attack';
} else {
return 'enemy attack';
}
}
甚至可以使用?
表达式制作更短,更漂亮的版本:
let doAttack = (firstAttacker, secondAttacker, statusOfBattle) => {
statusOfBattle = createNonHitMessages(secondAttacker, firstAttacker, statusOfBattle);
return statusOfBattle.attackerDodged ? 'attacker attack' : 'enemy attack';
}
switch (a) {
case x:
// do something
break;
case y:
// do something else
break;
case z:
// do third thing
break;
}
大致相当于:
if (a === x) {
// do something
} else if (a === y) {
// do something else
} else if (a === z) {
// do third thing
}
因此,您的代码将无法正常工作,因为它正在测试以下内容:
if (statusOfBattle === (statusOfBattle.enemyDodged && statusOfBattle.enemyBlocked))
由于statusOfBattle
是一个物体,而statusOfBattle.enemyDodged && statusOfBattle.enemyBlocked
要么是true
,要么是false
,它们永远不会是平等的。
我不是这种风格的忠实粉丝,但你可以通过以下方式做你想做的事:
switch (true) {
...
}