关于jquery:Javascript:如何简化具有多个OR条件的if语句?

Javascript: How can I simplify an if-statement with multiple OR conditions?

抱歉,如果我在写这篇文章时犯了错误。我是新来的,不知道这是怎么回事,希望我能快点学。我也是javascript的新手。

所以问题是:我的code.elements.js文件中有这个文件,我不能让它工作。

这行吗?

1
if (codePrompt == (codeSwitch || codeSwitchBG || codeBlur || codeShowInfo)){};

还是我必须用正常的方式来做?,像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
if (codePrompt == codeSwitch || codePrompt == codeSwitchBG || codePrompt == codeBlur || codePrompt == codeShowInfo){};


var codeSwitch = 'switch()';
var codeSwitchBG = 'switch(background)';
var codeBlur = 'blur()';
var codeShowInfo = 'showInfo()';

$(".code").on("click", function () {
var codePrompt = prompt("Set the code in the command line.");
if (codePrompt == (codeSwitch || codeSwitchBG || codeBlur || codeShowInfo)) {
    if (codePrompt == codeSwitch) {
        alert("Switching background...");
        console.log("Used '" + codeSwitch +"' command.");
    } else if(codePrompt == codeBlur) {
        alert("Blurring elements...");
        console.log("Used '" + codeBlur +"' command.");
    } else if(codePrompt == codeSwitchBG) {
        alert("Switching background...");
        console.log("Used '"+ codeSwitchBG +"' command.");
    }else if(codePrompt == codeShowInfo) {
        alert("Showing info...");
        console.log("Used '"+ codeShowInfo +"' command.");
    }
} else {
    alert("Wrong command, try again.");
    console.log("Wrong command, try again.");
};
});


"正常"的工作方式和你可能期望的一样。

但是,无论如何,if语句是多余的。你可以跳过它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (codePrompt === codeSwitch) {
    alert("Switching background...");
    console.log("Used '" + codeSwitch +"' command.");
} else if (codePrompt === codeBlur) {
    alert("Blurring elements...");
    console.log("Used '" + codeBlur +"' command.");
} else if (codePrompt === codeSwitchBG) {
    alert("Switching background...");
    console.log("Used '" + codeSwitchBG +"' command.");
} else if (codePrompt === codeShowInfo) {
    alert("Showing info...");
    console.log("Used '" + codeShowInfo +"' command.");
} else {
    alert("Wrong command, try again.");
    console.log("Wrong command, try again.");
}

对于switch来说,这是一个很好的用例,我将通过以下方式对其进行重构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var alertMessage ="",
    consoleMessage ="Used '" + codePrompt +"' command.";
switch (codePrompt) {
    case codeSwitch:
        alertMessage ="Switching background...";
        break;
    case codeBlur:
        alertMessage ="Blurring elements...";
        break;
    case codeSwitchBG:
        alertMessage ="Switching background...";
        break;
    case codeShowInfo:
        alertMessage ="Showing info...";
        break;
    default:
        alertMessage = consoleMessage ="Wrong command, try again.";
        break;
}
alert(alertMessage);
console.log(consoleMessage);


你必须按照你提到的第二种方式来做:

1
2
if (codePrompt == codeSwitch ||
codePrompt == codeSwitchBG || codePrompt == codeBlur || codePrompt == codeShowInfo){};


您还可以按如下方式重构以删除if/switch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var commands = {
    'switch()': 'Switching background',
    'switch(background)': 'Switching background',
    'blur()': 'Blurring elements',
    'showInfo()': 'Showing info'
};

$(".code").on("click", function () {
    var codePrompt = prompt("Set the code in the command line.");
    if (commands.hasOwnProperty(codePrompt)) {
        alert(commands[codePrompt] + '...');
        console.log("Used '" + codePrompt +"' command.");
    } else {
        alert("Wrong command, try again.");
        console.log("Wrong command, try again.");
    }
});

因为javascript有短路评估,而且您的字符串是真实的,所以您需要使用第二种方法或您所说的"正常方法"。

第一种方法不起作用,因为你最终会评估错误的事情。评估工作如下:

var result = 0 ||"zero" ;

  • 0进行评估,判定为不可靠。
  • "zero"被认为是真实的,并成为结果。

var result ="zero" || 0 ;

  • "zero"进行评估,确定其真实性,并作为结果返回。
  • 由于短路评估,未对0进行评估。

在原始代码中:

if (codePrompt == (codeSwitch || codeSwitchBG || codeBlur || codeShowInfo)){};

||的运算符关联性是从左到右的。括号从内到外进行计算。

首先评估(codeSwitch || codeSwitchBG || codeBlur || codeShowInfo)。由于我们已经讨论过的规则,结果变成了codeSwitch

  • codeswitch codeswitchbg变为codeswitch
  • codeswitch codeblur变为codeswitch
  • codeswitch codeshowinfo变为codeswitch

所以你最终会评估:

if(codePrompt == codeSwitch)

这当然是错误的。


在实现这种逻辑的过程中,我建议使用switch语句来实现可读性,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
switch (codePrompt){
case"switch()":
{
    //Handle case
    break;
}
case"switch(background)":
{  
   //Handle Case
   break;
}
case"blur()":
{
    //Handle Case
    break;
}
default :
{
  alert("Wrong command, try again.");
  console.log("Wrong command, try again.");
}

是的,你必须用"正常"的方式。

什么

1
if (codePrompt == (codeSwitch || codeSwitchBG || codeBlur || codeShowInfo)){};

确实是

1)测试所有开关——如果有,返回真

2)测试codeprompt==true或false。

基于您的代码,您可以完全删除该测试,然后直接进入您的最后一个测试。

另一个选项是使用switch语句,最后一个else将成为默认子句。