2014-07-01 73 views
0

我只是不明白如何& &和||工作。我寫了一小段代碼來幫助自己,這對我來說沒有任何意義。你會點擊一個按鈕並調用startGame()。JavaScript邏輯運算符的問題?

var startGame = function() { 
var quizAnswers = { 
    name: prompt("What is your name?").toUpperCase(), 
    age: prompt("What is your age?"), 
    snack: prompt("What is your favorite type of snack out of the following: ice cream, apple, chips, cookies?").toUpperCase() 
}; 

quizAnswers.confirmAge = function() { 
     while (isNaN(this.age) === true) { 
      this.age = prompt("The age that you entered- " + this.age + " -is not a number. Please enter a number."); 
     }; 
}; 

quizAnswers.confirmAge(); 

quizAnswers.confirmSnack = function() { 
     while ((this.snack !== "ICE CREAM") && (this.snack !== "APPLE") && (this.snack !== "CHIPS") && (this.snack !== "COOKIES")) { 
      this.snack = prompt("The snack you entered- " + this.snack + " -is unrecognized. Please enter: ice cream, apple, chips, or cookies.").toUpperCase(); 
     }; 
}; 

quizAnswers.confirmSnack(); 

它會得到的姓名,年齡,以及最喜歡的零食,然後檢查,看看如果年齡是一個數字,進入小吃列出的選項之一。在調用confirmSnack函數中的while循環之後,我想出瞭如何使其工作,如上所示。但爲什麼它是& &而不是||。而且是有辦法縮短它喜歡:

while (this.snack !== ("ICE CREAM" && "APPLE" && "CHIPS" && "COOKIES")) { 
    this.snack = prompt("The snack you entered- " + this.snack + " -is invalid. Please enter: ice cream, apple, chips, or cookies.").toUpperCase(); 
     }; 

所以問題是解釋爲什麼& &(和)是用來代替||(或),如果有一種方法來縮短這個代碼,所以我不必輸入「this.snack!==」四次。我不是專家,所以請儘量保持簡單。

+0

嘗試朗讀表達式,對「!==」使用「不同於」。很顯然,「a與b不同,或者a與c不同」並不是你想要的邏輯,因爲它可以和b一樣,只要它與c不一樣。 – IMSoP

+0

這與JavaScript無關,更像數學和邏輯。 –

回答

1

&&||運營商比較布爾值值。 (布爾表示真/假)。這意味着如果你執行5 == 5 && 6 + 1 == 7解釋做以下的事情:

  1. 評估5 == 5。如果雙方相等(如你所知),==運算符返回true。由於5 == 5true,我們看下一個值(如果它是錯誤的,由於短路操作,它會立即返回錯誤)。

  2. 評估6 + 1 == 7。這也是如此,所以返回的值是true

&&操作者不正規的值進行比較,如"ICE CREAM"(以及它,但它把它轉換成一個布爾值)。

現在讓我們來看看你提供的代碼:

this.snack !== ("ICE CREAM" && "APPLE" && "CHIPS" && "COOKIES")

首先,JavaScript解釋器執行("ICE CREAM" && "APPLE" && "CHIPS" && "COOKIES")。由於所有這些值均爲真,該表達式的值爲true。所以這個比較本質上是檢查this.snack !== true,這不是你想要的。

要解決您的問題,我建議使用indexOf。這將檢查元素是否在數組中,如果沒有元素,則返回-1。例如:

var validSnacks = ["ICE CREAM", "APPLE", "CHIPS", "COOKIES"]; 
while (validSnacks.indexOf(this.snack) === -1) { 
    // Do something 
} 
0

如果使用or(||),如果子報表的任何(例如this.snack!==「冰淇淋」)評估爲true,整個語句將是真實的,造成的提示中顯示。

在另一方面,使用and(&&)子語句的所有必須爲真爲整個語句評估爲真,這是你想要的行爲 - 你只是想提示顯示,如果小吃不是4個選項之一。

無法按照您的建議縮短代碼。你可以做的一件事就是製作一個包含4個選項的數組,並檢查該數組是否包含點心。

2

的& &操作人員工作得很好。這實際上是一個邏輯問題,而不是JavaScript。

你問這個問題的答案與所有​​可能的答案不同。

它可以用||來重寫。如下所示:

while (!(this.snack == "ICE CREAM" || this.snack == "APPLE" || this.snack == "CHIPS" || this.snack == "COOKIES")) 

注意!運算符在開頭。

一個較短的形式來寫這將是:

answers = ["ICE CREAM", "APPLE", "CHIPS", "COOKIES"]; 
while (answers.indexOf(this.snack) < 0) { ... } 

在這裏定義可能答案的列表,並要接受,並檢查答案是其中之一。

+0

這是一個很好的縮短代碼。 –