0

私のif条件を見てください。私はJavaScriptを更新したばかりで、挿入された変数が使用したいものであるかどうかをどのように確認できるか疑問に思っています。

明らかに、「ゲーム」はジャンケンかハサミだけを取るべきです。

if 条件は、 if (choice 1 and choice 2 equal じゃんけん or paper) { do this; と言っています。} 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

配列を使用した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 に答える
1

|| "paper"問題は、条件が true -y 値を返すため、条件が常に true と評価されることです。値が OR されているため、それだけで条件全体が true になり、常にパスします。をチェックしていますがchoice1 && choice2 === "rock"、実際には正しく書かれていません。ここでは定義されていないため|| scissors、それは false になります。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)) {
    // ...
}
于 2013-11-08T02:04:45.697 に答える
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 配列内のいずれかの値と一致するかどうかを確認できます。

于 2013-11-08T02:08:11.463 に答える
0

あなたが言う時:

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

これが英語で意味することは、「someString の値が空の文字列でない場合、何かを行う」ということです。Javascript では、これは一般に「真実性」と呼ばれるため、空の文字列を除いて、すべての文字列の真実性は true です。

あなたが言う時:

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

英語で書かれたこれは、「someCondition が true と評価された場合、または someString が true の場合、何かを行う」という意味です。「紙」はanything || "paper"常に真なので、常に真です。

あなたの目的のために、私は次のようにコードを書き直します:

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

基本的に、有効な値のリストを作成し、そのリストに両方の選択肢があるかどうかを確認します。じゃんけんゲームでは、より有効な値が得られることはありませんが、他の同様の状況では、このリストは時間の経過とともに拡大または縮小する可能性があります。

于 2013-11-08T02:24:00.873 に答える
0
if(choice1 && choice2 === "rock" || "paper" || scissors) {

if条件が取得するすべての値を渡すのはなぜですか?

として評価されるからです。

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

これはおそらくあなたが望んでいたものではありません。空でない文字列"paper"は真の値であり、常に条件を満たします (また、短絡評価のため、参照エラーscissorsは確認されません)。

正しく行う方法については、値のリスト (およびその多くのリンクされた重複) に対して変数の等価性を確認するを参照してください。

于 2013-11-08T02:06:21.847 に答える
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 に答える