JavaScript逻辑运算符问题

JavaScript logical operators questions?

本文关键字:问题 逻辑运算符 JavaScript      更新时间:2023-09-26

我就是不明白&&还有工作。我写了一个小代码来帮助自己,但它对我来说没有任何意义。你可以点击一个按钮,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();
        };

所以问题是解释为什么使用&&(and)而不是||(or),如果有一种方法可以缩短这个代码,这样我就不必输入"this"。零食!=="四次。我不是专家,所以请尽量保持简单。

<span;接线员工作正常。这实际上是一个逻辑问题,而不是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) { ... }

这里你定义了一个你想要接受的可能答案的列表,并检查这个答案是否在其中

&&||运算符比较布尔值。(布尔值表示真/假)。这意味着如果执行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
}

如果您使用or(||),如果任何子语句(例如:== "ICE CREAM")求值为true,则整个语句为真,并显示提示符

另一方面,使用and(&&)所有的子语句必须为真,整个语句才能被评估为真,这是你想要的行为-你只希望提示显示如果零食不是4个选项之一。

没有办法按照你建议的方式缩短代码。你可以做的一件事是创建一个包含4个选项的数组,并检查该数组是否包含snack.