Javascript 有没有更好的方法来编写这个switch语句
考虑以下switch语句:Javascript 有没有更好的方法来编写这个switch语句,javascript,switch-statement,Javascript,Switch Statement,考虑以下switch语句: let doAttack = (firstAttacker, secondAttacker, statusOfBattle) => { statusOfBattle = createNonHitMessages(secondAttacker, firstAttacker, statusOfBattle); switch(statusOfBattle) { case statusOfBattle.enemyDodged && st
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
、enemeyblock
、attackerblock
和attackerodged
都将返回true
或false
我真的不想写一个巨大的if语句,我没有什么反对它的,除了当我有这么多条件时它看起来不太干净
if一个if
语句是取得成功的唯一方法,但我希望我可以检查像这样的switch语句中的布尔值,这样我就可以保持它的干净性和可读性
我显然不理解switch语句的局限性
有什么想法吗?这不是
开关的工作方式
它在括号之间计算对象,在您的案例中是状态属性
,并执行与对象相等的值的案例。您的语句与任何情况都不匹配,因为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';
}
}
Make您甚至可以使用?
表达式制作更短、更好看的版本:
let doAttack = (firstAttacker, secondAttacker, statusOfBattle) => {
statusOfBattle = createNonHitMessages(secondAttacker, firstAttacker, statusOfBattle);
return statusOfBattle.attackerDodged ? 'attacker attack' : 'enemy attack';
}
大致相当于:
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) {
...
}
您可以在一个对象数组中设置所有潜在值及其相应的操作,然后在数组上循环,检查每个对象是否匹配,当找到匹配时,执行其操作。@ScottMarcus您能提供一个示例吗?首先,你能解释一下
statusOfBattle
对象如何等于它自身的两个属性吗?case
是==
比较的缩写。所以您正在测试statusOfBattle==(statusOfBattle.enemyDodged&&statusOfBattle.enemyBlocked)
。这显然是错误的。@scottmarcusif是一个递归结构,我真的希望避免if语句,但似乎没有其他方法。哈哈哈。
switch (true) {
...
}