Basic JavaScript if vs. else if

Basic JavaScript if vs. else if

本文关键字:if else vs Basic JavaScript      更新时间:2023-09-26

我的问题是:我是JavaScript的新手,我正在努力理解"if{"answers"else if{

我正在做codecademy上的岩石剪刀游戏项目。我的Math.random()方法生成一个随机数。我首先实现了我的代码if(computerChoice<=0.33){

其替代方案为:

if (computerChoice > 0.67){......    Which checked out and produced a viable answer. 

然而,它在建议中使用了else-if语句。我的具体问题是,在这两种情况下,我基本上都设置了一个低范围和一个高范围,剩下的代表中间。Else表示不是以前的条件。但是,如果我对第二个if的条件已经在逻辑上排除了之前的答案(无论如何,必须在else-if选项中从逻辑上排除之前的答案),那么到底有什么区别,为什么要使用else-if/何时需要else-if?

我的代码如下:

选项一(否则):

var userChoice = prompt("do you want rock paper or scissors?");
var computerChoice = Math.random();
if (computerChoice <= 0.33){
  computerChoice = "rock";
}
else if (computerChoice >= 0.67){
 computerChoice = "scissors";
}
else {
 computerChoice = "paper";
}
console.log(computerChoice);

选项二(2如果有的话):

var userChoice = prompt("do you want rock paper or scissors?");
var computerChoice = Math.random();
if (computerChoice <= 0.33){
 computerChoice = "rock";
}
if (computerChoice >= 0.67){
 computerChoice = "scissors";
}
else {
 computerChoice = "paper";
}
console.log(computerChoice);

If else-If-else逻辑比第二个例子更优雅,因为它将在进行正确的赋值后停止计算条件。

考虑一下如果computerChoice为0.25,您的第二种情况(没有其他if)将如何工作。第一个if条件将评估为true,computerChoice将被重新分配给"rock"。然而,逻辑不会认为自己完成了,而是继续进行,并检查computerChoice是否>=0.67。由于computerChoice现在是"岩石",解释器将尝试将其转换为数值。既然岩石不会改变,我猜你的逻辑现在会按预期运行。

但是,考虑这样一种情况:您决定将实体(石头、纸和剪刀)定义为对象,并使用该对象的索引作为处理的输出。例如:

var myentities = 
{
    1: { name: "rock", image_url: "..." },
    2: { name: "paper", image_url: "..." },
    3: { name: "scissors", image_url: "..." }
};

假设您也决定停止使用对象的名称,而是使用其ID。在这种情况下,您的第一个if会将值1分配给computerChoice,然后第二个if会检查1是否>=0.67。结果,你的代码会(相当无辜地)100%地挑纸,在短时间内让你非常困惑。

这个故事的寓意是:不必要的评价永远不会帮助你,可能会伤害你。

如果您正在检查同一变量(或类似的变量)的不同条件,那么else-If会更快。如果它匹配一个条件,它就会执行,然后在语句中完成。一大堆if语句意味着无论第一个语句是否为真,代码都必须运行其中的每一个语句。不过要注意,对于"else-if",你一定只是在寻找匹配的条件之一。如果你希望它在那之后仍然检查任何内容,那么它必须是另一个"If"语句。

但是,如果我对第二个if的条件已经在逻辑上排除了之前的答案(无论如何,必须在else-if选项中从逻辑上排除之前的答案),那么到底有什么区别,为什么要使用else-if/何时需要else-if?

=>无,但是else语句会强制执行,以防您在"逻辑排除"中出错。

即使这有点超出了你的问题范围,也值得注意的是,JavaScript中没有"else-if"构造。当你写:

if (...) {
} else if (...) {
}

你基本上在做的是:

if (...) {
} else {
  if (...) {
  }
}

它之所以有效,是因为您可以在else关键字之后传递任何语句。看见http://www.ecma-international.org/ecma-262/5.1/#sec-12.5:-)

更新1

if (weight <= 130) {
  fighter = "lightweight";
} else if (weight >= 205) {
  fighter = "heavyweight";
} else {
  fighter = "middleweight";
}

在javascript中,它相当于:

if (weight <= 130) {
  fighter = "lightweight";
} else {
  if (weight >= 205) {
    fighter = "heavyweight";
  } else {
    fighter = "middleweight";
  }
}

更新2

在你最初的帖子,选项2,你做:

if (computerChoice <= 0.33){
  computerChoice = "rock";
}
if (computerChoice >= 0.67){
 computerChoice = "scissors";
}
else {
  computerChoice = "paper";
}

如果computerChoice为<=0.33,将会发生以下情况:

if (0.33 <= 0.33) ... // => computerChoice = "rock"
if ("rock" >= 0.67) ... else [THE ELSE PART IS EXECUTED!]

所以基本上电脑的选择将是"纸"任何时候它应该是"岩石"。67%的时间你会有"纸",33%的时间你有"剪刀"!之所以会发生这种情况,是因为当您尝试比较不同类型的值时,Javascript不会抛出错误(即这里的字符串"rock"和数字"0.67";相反,它试图通过一些神奇的强制规则转换同一类型的值(http://webreflection.blogspot.be/2010/10/javascript-coercion-demystified.html)然后愉快地回答"假的!"。作为一名数学专业的学生,我可能会说,由于这些胁迫规则,你可以用javascript证明true=false。。。

附言:我刚刚注意到Kevin Nielsen在上面的解释比我好得多。给你!