我如何误用 ||这段代码中的逻辑运算符

How am I mis-using the || logical operator in this piece of code?

本文关键字:代码 逻辑运算符 何误用 段代码      更新时间:2023-09-26
var user = prompt("Prose prose prose. Do you SCREAM, TURN AROUND, or RUN").toUpperCase();
switch (user) {
    case 'SCREAM':
        var choice1 = prompt("Prose prose prose. Do you TURN AROUND, PASS OUT, or USE MAGIC").toUpperCase();
            if (choice1 === "TURN AROUND" || "TURN") {
                console.log("Prose prose prose!")
            } else if (choice1 === "PASS_OUT" || "PASS" || "FAINT" || "FEINT") {
                console.log("Prose prose prose.")
            } else if (choice1 === "USE_MAGIC" || "MAGIC" || "SPELL" || "WIZARDRY") {
                console.log("Prose prose prose.")
            } else if (choice1 === "4" && "2" || "42") {
                console.log("Congratulations, You have chosen the secret option! You win!")
            } else {
                console.log("I'm sorry, I didn't understand that. Try again!")
            }
        break;
 //imagine default state and rest of code are here

所以这只是我正在处理的一个非常基本的代码片段。我遇到的问题是,每次我选择任何"PASS OUT"或"USE MAGIC"选项时,该选择会自动默认为"TURN AROUND"选项。现在我发现,如果我只有两个逻辑运算符用于这些else if语句,问题就会消失。但是从我在互联网上读到的内容来看,我可以在逻辑运算符之间放置多少东西不应该有限制。我做错了什么?

您正在寻找:

if (choice1 === "TURN AROUND" || choice1 === "TURN") {

。等等。例如,您必须在||运算符的每一侧进行比较。原因见下文。

但在这种情况下,我可能会使用另一个switch(可能在单独的函数中,以防止事情变得太复杂(,或者可能使用查找表。


您的原始表达式的计算方式如下:

if ((choice1 === "TURN AROUND") || "TURN") {

。对于choice1 = "FOO"(例如(来说,它变成了:

if (false || "TURN") {

。因为choice1不是"TURN AROUND".然后变成:

if ("TURN") {

。因为奇怪的强大||操作员的工作方式。因为这是真实的,所以即使choice1与任何一种选择都不匹配,您也会分支到if块。

这里的问题是,|| 运算符测试左侧的语句是否为真,或者右侧的语句是否为真。因此,在您的第一个 if 语句的情况下,它会测试 choice1 === "TURN AROUND" 是否为真或 "TURN" 是否为真。而且由于您只是检查字符串,因此它始终为真。

您在这里要做的是,始终像这样检查选项 1:

if(choice1 === "TURN AROUND" || choice1 === "TURN"){
    console.log("Prose prose prose!");
} else if (choice1 === "PASS OUT" || choice1 === "PASS" || choice1 === "FAINT" || choice1 === "FEINT"){
    console.log("Prose prose prose.");
}  // and so on
[...]

你可以通过使用adeneo的建议来简化你的代码:

if(["TURN AROUND", "TURN"].indexOf(choice1) !== -1){
    console.log("Prose prose prose!");
} else if(["PASS OUT", "PASS", "FAINT", "FEINT"].indexOf(choice1) !== -1){
    console.log("Prose prose prose.");
} // and so on