Javascript如果条件具有多个OR和AND

时间:2013-11-08 01:52:56

标签: javascript html

请查看我的if条件。 我只是刷新我的javascript,我想知道,我如何检查,如果插入的变量,是我想要使用的那些。

显然,“游戏”应该只采取摇滚,纸张或剪刀。

现在if条件说,if(选择1和选择2等于摇滚或剪刀或纸){     做这个; } else {做其他事情}

但显然它不按我想要的方式工作。

var choice1 = prompt("Player 1: Rock, scissors or paper?");
var choice2 = prompt("Player 2: Rock, scissors or paper?");

compare(choice1, choice2);

function compare(choice1, choice2) {

if(choice1 && choice2 === "rock" || "paper" || scissors) {
    alert("You pass");
} else {
    alert("Something went wrong");
}

有人能给我一个简短的解释,为什么if条件会传递它得到的每一个值?它永远不会显示消息“出了问题”。

7 个答案:

答案 0 :(得分:2)

我相信它应该是这样的:

if ((choice1=="rock" || choice1=="paper" || choice1=="scissors") && 
    (choice2=="rock" || choice2=="paper" || choice2=="scissors")){...

答案 1 :(得分:1)

问题是您的条件将始终评估为true,因为|| "paper"条件将返回true-y值。仅这一点就可以使整个条件成立,因为值是OR,因此它总是通过。您正在检查choice1 && choice2 === "rock",这是真的没有写得正确。至于|| scissors,因为scissors未在此处定义,因此将为假。

考虑采用这种方法:

var validOptions = ["rock", "paper", "scissors"];
if(validOptions.indexOf(choice1) > -1 && validOptions.indexOf(choice2) > -1) {
    // now compare choice1 and choice2 to determine the winner
} else {
    alert("Something went wrong");
}

请注意,显示的解决方案不会修改用户输入或区分大小写的帐户。为了解决这个问题,你可以使用带有ignore-case标志的正则表达式:

var re = /\b(?:rock|paper|scissors)\b/i;
if (re.test(choice1) && re.test(choice2)) {
    // ...
}

答案 2 :(得分:1)

对于数组有很多 indexOf 答案,但您也可以使用对象进行有效的resopnses:

var validResponses = {rock:'', paper:'', scissors:''};

if (choice1 in validResponses && choice2 in validResponses) {
  // all good
}

如果你想要安全:

if (validResponses.hasOwnProperty(choice1) && validResponses.hasOwnProperty(choice2)) {
  ...
}

答案 3 :(得分:0)

if(choice1 && choice2 === "rock" || "paper" || scissors) {
     

有人能给我一个简短的解释,为什么if条件会传递它得到的每一个值?

因为它将被评估为

if ((choice && (choice2 === "rock")) || "paper" || scissors )

这可能不是你想要的。非空字符串"paper"是一个真值,这意味着它将始终满足条件(并且由于短路评估,将不会查看参考错误scissors)。

请参阅Check variable equality against a list of values(及其许多链接重复项)以了解如何正确执行此操作。

答案 4 :(得分:0)

function compare(choice1, choice2){
  var identical = choice1 === choice2;
  var options = ["rock", "paper", "scissors"];

  if (identical && (options.indexOf(choice1) > -1))
    alert("Pass");
  else
    alert("Not alike");

}

在此代码中,identical将为true或false,如果为true,则可以检查它是否与options数组中的任何值匹配。

答案 5 :(得分:0)

您的代码正在按以下方式进行评估:

if (
    choice1 // Non-empty strings always evaluate to TRUE
    &&
    choice2 === "rock"
    // The above are evaluated together
    // If both are not TRUE, FALSE is the result

    ||
    "paper" // Non-empty string. TRUE
    ||
    "scissors" // Non-empty string. TRUE
    )

这个伪代码可能会有所帮助:

if (value of AND block
    ||
    true
    ||
    true)

由于OR每次都有true ,所以if块每次都会运行

答案 6 :(得分:0)

当你说:

if(someString) { /* do something */ }

这在英语中意味着“如果someString的值不是空字符串,那就做点什么吧。”在Javascript中,这通常被称为“真实性”,因此任何字符串的真实性都是正确的,除了空字符串。

当你说:

if(someCondition || someString) { /* do something */ }

用英文写的,这意味着“如果someCondition评估为true,或者someString是真的,那么就做点什么。”由于“纸张”总是真实的,anything || "paper"总是如此。

出于您的目的,我会重写这样的代码:

var validValues = ["rock", "paper", "scissors"];
if(validValues.indexOf(choice1) >= 0 && validValues.indexOf(choice2) >= 0) {
    /* do something */
}

基本上,列出有效值,然后检查两个选项是否都出现在该列表中。摇滚,纸张,剪刀的游戏永远不会获得更多有效值,但在其他类似的情况下,这个列表可能会随着时间的推移而增长或缩小。