无法退出 do while 循环

问题描述

我正在构建一个简单的石头剪刀布,我可以通过浏览器控制台播放它。使用 do/while 循环,我会提示选择三个可接受的选项“石头”、“纸”或“剪刀”之一。一旦玩家输入这 3 个可接受的选项之一,do/while 循环就应该终止。问题是它没有。

function playerPlay(){
    let choice;
    do{
      choice = prompt("Rock,paper or scissors?").toLowerCase();
      console.log(choice);
      console.log(choice !== "rock" || choice !== "paper" || choice !== "scissors");
      console.log(choice === "rock" || choice === "paper" || choice === "scissors");
    } while (choice !== "rock" || choice !== "paper" || choice !== "scissors");
    return choice; 
  }

  playerPlay();

我一直在尝试使用 console.log 进行调试,发现播放器给出的提示选择似乎工作正常(请参见下面的屏幕截图)令人难以置信:

  1. 当输入是“rock”、“paper”或“scissors”时,两个console.log布尔测试记录“true”。第一个 console.log 应该记录 false(意外),而第二个应该记录 true(预期)。

  2. 当输入为“notRockPaperScissors”时,第一个 console.log 布尔测试记录为真(预期),而第二个 console.log 布尔测试记录为假(预期)。

enter image description here

我当然错过了显而易见的事情,但作为初学者,我只是看不出是什么导致了这种情况的发生,了解原因肯定会对我(以及其他学习者)有所帮助。感谢您的帮助!

解决方法

您应该使用 && 运算符而不是 || 运算符。

即而不是这个

while (choice !== "rock" || choice !== "paper" || choice !== "scissors");

使用这个

while (choice !== "rock" && choice !== "paper" && choice !== "scissors");

这样做的原因是我们希望程序在 choice 接受任何值 [rock,paper,scissors] 时退出。在 || 运算符中,如果任何条件的计算结果为真,循环将继续;在 && 运算符中,如果任何条件的计算结果为假,循环将退出。因此,如果选择采用任何列出的值,条件将评估为假,然后整个条件将评估为假。

,
while (choice !== "rock" || choice !== "paper" || choice !== "scissors")

您的条件始终为真,因为价值不是石头或纸,也不是 scicors,因为它不可能是全部。用 && 而不是 || 检查。

,

问题出在 while 条件中,您的程序将在 while 循环中堆栈,直到他得到一个错误条件。

while (choice !== "rock" || choice !== "paper" || choice !== "scissors")

随着|| (OR) 逻辑运算符,您将在无限循环中堆叠。 您需要做的是更改为 && (AND) 运算符,如下所示:

while (choice !== "rock" && choice !== "paper" && choice !== "scissors")