是否有更好的方法来编写此开关语句javascript

问题描述 投票:0回答:2

请考虑以下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
}

enemeyDodgedenemeyBlockedattackerBlockedattackerDodged将返回truefalse

我真的不想写一个巨大的if声明,我没有反对它,除了它在我有这么多条件时看起来不太干净。

如果一个if语句是唯一的方法,但我希望我可以在这样的switch语句中检查布尔值,这样我就可以保持这个清晰可读。

我显然不明白switch语句的局限性。

有任何想法吗?

javascript switch-statement
2个回答
1
投票

这不是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';
}

0
投票
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) {
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.