[英]is there a better way to write this switch statement javascript
考虑以下 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) {
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.