Javascript do/while循环显示意外结果

Javascript do / while loop displays unexpected result

本文关键字:显示 意外 结果 循环 while do Javascript      更新时间:2023-11-12

有人能帮我理解为什么下面的问题会发生在下面的excersise上吗?

循环应该以5为增量向上和向下计数,并带有一个文本字符串。除了do/while循环不包括带有最终数字的文本字符串之外,这三个循环都能工作。它只是说"50"而不是"数字50"。

for (x=1; x<50; x+=5) {
    console.log("The number " + x);
}
var y = 50
while (y>1) {
    console.log("The number " + y);
    y-=5;
}
var z = 0;
do {
    console.log("The number " + z);
    z+=5;
}
while(z<50);

它们都不包含;他们都没能输出最后一个数字

重要信息:此错误与使用do-whilewhilefor无关。您没有注意到其他变量的原因是一个变量的最后一个值与下一个的第一个值重叠

如果您还记录了实际打印的变量,您会看到这一点。

console.log('x: ');
for (x=1; x<50; x+=5) {
    console.log("The number x " + x);
}
console.log('y: ');
var y = 50
while (y>1) {
    console.log("The number y " + y);
    y-=5;
}
console.log('z: ');
var z = 0;
do {
    console.log("The number z " + z);
    z+=5;
}
while(z<50);

您不打印最后一个数字的原因是您在打印后递增/递减

考虑以下循环:

var i = 0;
while(i < 5){
  console.log(i);
  i++;
}

i为4时,会发生以下情况:

  1. 日志i(4)
  2. 增量i(现在为5)
  3. i < 5错误
  4. <退出循环>

如您所见,i达到最后一个数字,但一旦达到,就不会打印出来。这个问题的一个简单解决方案是将<切换为<=,以使循环具有包容性。

当然,在您的情况下不应该显示"数字50":

...
console.log("The number " + z) // z == 45
z+=5 // z == 50
}
while (z<50); // no, exit from cycle
...

do-while语句定义为(emphasis mine):

生产do语句while(表达式);为评估如下:

  1. V=空
  2. 迭代为真
  3. 重复,而迭代为true
    1. stmt是评估语句的结果
    2. 如果stmt.value不为空,则设V=tmt.value
    3. 如果stmt.type未继续||tmt.target不在当前标签集中,则
      1. 如果stmt.type为break,且tmt.target在当前标签集中,则返回(normal,V,空)
      2. 如果stmt是突然完成,则返回stmt
    4. exprRef是评估表达式的结果
    5. 如果ToBoolean(GetValue(exprRef))为false,则将迭代设置为false
  4. 返回(正常,V,空)

因此,do-while语句的求值返回V,即它内部最后一个求值语句的值。

在这种情况下,是50。如果您在控制台中运行代码,控制台将显示代码返回的值,因此您将看到50。

如果你在一个页面上运行它,你不会看到50。