繁体   English   中英

有没有更好的方法来编写这个 switch 语句 javascript

[英]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
}

enemeyDodgedenemeyBlockedattackerBlockedattackerDodged都将返回truefalse

我真的不想写一个巨大的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.enemyBlockedtruefalse ,它们永远不会相等。

我不是这种风格的忠实粉丝,但你可以从以下开始做你想做的事:

switch (true) {
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM