Javascript 有没有更好的方法来编写这个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

考虑以下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
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) {
    ...
}