我只是不明白&&和||工作。我写了一个小代码来帮助自己,这对我没有任何意义。您可以单击一个按钮,然后调用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!= =“四次。我不是专家,所以请尽量保持简单。
答案 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
,解释器会执行以下操作:
评估5 == 5
。如果双方都相等(如您所知),==
运算符返回true。由于5 == 5
是true
,我们会查看下一个值(如果它是假的,由于短路运算符,它会立即返回false)。
评估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
}
答案 2 :(得分:0)
如果您使用or(||)
,如果任何子语句(例如this.snack!==&#34; ICE CREAM&#34;)评估为{{1} },整个语句都是真的,导致提示显示。
另一方面,使用true
,所有子语句必须为true才能将整个语句评估为true,这是您想要的行为 - 您只需要如果小吃不是4种选择之一,则需要提示。
无法以您建议的方式缩短代码。你可以做的一件事就是制作一个包含4个选项的数组,并检查该数组是否包含零食。