JavaScript逻辑运算符问题?

时间:2014-07-01 23:03:13

标签: javascript logical-operators

我只是不明白&&和||工作。我写了一个小代码来帮助自己,这对我没有任何意义。您可以单击一个按钮,然后调用startGame()。

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!= =“四次。我不是专家,所以请尽量保持简单。

3 个答案:

答案 0 :(得分: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) { ... }

在这里,您可以定义一个可能的答案列表,并希望接受,并检查答案是否在其中。

答案 1 :(得分:1)

&&||运算符会比较布尔值值。 (布尔值表示真/假)。这意味着如果您执行5 == 5 && 6 + 1 == 7,解释器会执行以下操作:

  1. 评估5 == 5。如果双方都相等(如您所知),==运算符返回true。由于5 == 5true,我们会查看下一个值(如果它是假的,由于短路运算符,它会立即返回false)。

  2. 评估6 + 1 == 7。这也是事实,因此返回值为true

  3. &&运算符不会比较常规值,例如"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
    }
    

答案 2 :(得分:0)

如果您使用or(||),如果任何子语句(例如this.snack!==&#34; ICE CREAM&#34;)评估为{{1} },整个语句都是真的,导致提示显示。

另一方面,使用true所有子语句必须为true才能将整个语句评估为true,这是您想要的行为 - 您只需要如果小吃不是4种选择之一,则需要提示。

无法以您建议的方式缩短代码。你可以做的一件事就是制作一个包含4个选项的数组,并检查该数组是否包含零食。