【问题标题】:Javascript if statement in while loopwhile循环中的Javascript if语句
【发布时间】:2017-02-20 07:11:00
【问题描述】:

您可以在下面找到用于创建 1 到 80 之间的 8 个随机数的代码。它将随机数放入 numbers 数组并写入 div。如果在 if 括号内增加 x ,则代码运行没有任何问题。 如果我将“x++”放在 if 括号之外,经过几次运行后,我发现有时它会创建相同的随机数并在 numbers 数组中找到。然后它跳过并且那个 div 为空。

在 if 块中增加 x 和在 if 块之外增加 x 有什么区别?

在 if 块内:

var numbers = []
var luckyNumber;
var x = 1;

while (x <= 8) {
  luckyNumber = Math.floor(Math.random() * 80 + 1);
  if (numbers.indexOf(luckyNumber) == -1) {
    document.getElementById('k' + x).innerHTML = luckyNumber;
    numbers.push(luckyNumber);
    x++;
  }
}

在 if 块之外:

var numbers = []
var luckyNumber;
var x = 1;

while (x <= 8) {
  luckyNumber = Math.floor(Math.random() * 80 + 1);
  if (numbers.indexOf(luckyNumber) == -1) {
    document.getElementById('k' + x).innerHTML = luckyNumber;
    numbers.push(luckyNumber);
  }
  x++;
}

HTML:

<div id="k1">K1</div>
<div id="k2">K2</div>
<div id="k3">K3</div>
<div id="k4">K4</div>
<div id="k5">K5</div>
<div id="k6">K6</div>
<div id="k7">K7</div>
<div id="k8">K8</div>

【问题讨论】:

    标签: javascript if-statement while-loop increment


    【解决方案1】:

    当您将增量放在 if 条件之外时,如果 numbers 数组中已经存在一个数字,那么它将不会进入 if 条件,因此 div 永远不会填满。但是,您继续前进到下一个 div,因为您增加了 x 值。如果将x 增量放在外部,则x 值在if 内部的条件不满足时保持不变,因此在下一次迭代中,条件可能会通过或继续尝试。

    执行流程

    当你有增量时

    1) Generate random number.
    2) Check in is already generated, if yes skip it. // you see ? when skip no increment happens, because the increment inside the the condition.
    3) Generate again and go to step 2.
    

    当你在外面有增量时

    1) Generate random number.
    2) Check in is already generated, if yes skip it. Increase x value to next. //** you see ? incrementing no matter you skip it or not.
    3) Generate again and go to step 2.
    

    【讨论】:

    • 它是否继续创建随机数并检查它是否已经在 numbers 数组中?我认为 if 语句为 while 循环的每次迭代运行一次。所以它不会增加,直到条件为真并继续尝试。对吗?
    • @user7580495 是的。是,否则,如果曾经生成过,在数组中找到,则需要再次生成并检查。不是吗?现在正在发生。
    【解决方案2】:
    • 因为在第一个示例中,您仅在生成唯一随机数的情况下才推进x
    • 在第二个示例中,无论生成的编号是否唯一,您都可以前进x。因此,在这种情况下,它可能会发生 8 次尝试(因为这是您的 while 条件),例如,它只生成了两个唯一的随机数。

    【讨论】:

      【解决方案3】:

      如果你在外面写 x++,如果它总是增加 1 ..如果你把它放在里面,如果你的条件满足时它会增加..根据这个,你的输出可能会有所不同。

      【讨论】:

        【解决方案4】:

        如果号码已被占用,您可以使用do while 循环进行检查。

        var numbers = [],
            luckyNumber,
            x = 1;
        
        while (x <= 8) {
            do {
                luckyNumber = Math.floor(Math.random() * 80 + 1);
            } while (numbers.indexOf(luckyNumber) !== -1)
            document.getElementById('k' + x).innerHTML = luckyNumber;
            numbers.push(luckyNumber);
            x++;
        }
        <div id="k1">K1</div>
        <div id="k2">K2</div>
        <div id="k3">K3</div>
        <div id="k4">K4</div>
        <div id="k5">K5</div>
        <div id="k6">K6</div>
        <div id="k7">K7</div>
        <div id="k8">K8</div>

        【讨论】:

          【解决方案5】:

          在外部递增,if 块将无条件执行。

          但是你在里面递增,if 块只会在条件为真时执行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-05-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-09
            • 2014-01-21
            • 2015-11-08
            相关资源
            最近更新 更多