0

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

显然,“游戏”应该只用石头、纸或剪刀。

现在 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 条件会传递它获得的每个值?它从不显示消息“出了点问题”。

4

7 回答 7

2

我相信它应该看起来像:

if ((choice1=="rock" || choice1=="paper" || choice1=="scissors") && 
    (choice2=="rock" || choice2=="paper" || choice2=="scissors")){...
于 2013-11-08T02:00:38.990 回答
1

问题是您的条件将始终评估为真,因为|| "paper"条件将返回一个真值。仅此一项就使整个条件为真,因为这些值是 OR'd,所以它总是通过。您正在检查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");
}

请注意,显示的解决方案不会修剪用户输入或区分大小写。要解决这个问题,您可以使用带有忽略大小写标志的正则表达式:

var re = /\b(?:rock|paper|scissors)\b/i;
if (re.test(choice1) && re.test(choice2)) {
    // ...
}
于 2013-11-08T02:04:45.697 回答
1

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

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

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

如果你想安全的话:

if (validResponses.hasOwnProperty(choice1) && validResponses.hasOwnProperty(choice2)) {
  ...
}
于 2013-11-08T02:44:59.250 回答
0
if(choice1 && choice2 === "rock" || "paper" || scissors) {

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

因为它将被评估为

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

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

有关如何正确执行此操作,请参阅针对值列表(及其许多链接的重复项)检查变量相等性。

于 2013-11-08T02:06:21.847 回答
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将为真或假,如果为真,您可以检查它是否与选项数组中的任何值匹配。

于 2013-11-08T02:08:11.463 回答
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 块每次都会运行。

于 2013-11-08T02:14:28.283 回答
0

当你说:

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

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

当你说:

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

用英语写成这意味着“如果 someCondition 计算结果为真,或者如果 someString 为真,那么做某事。” 既然“纸”总是真实的,anything || "paper"永远是真实的。

为了您的目的,我会像这样重写代码:

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

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

于 2013-11-08T02:24:00.873 回答