JS做...而

JS do ... while

在我看来,我误解了 JS 中 do ... while 循环的行为。 假设我们有这样的代码:

var a = [1,2,3,4,5];
var b = [];
var c;
do {c = a[Math.floor(Math.random()*a.length)];
    b.push(c);}
while(c===4);
console.log(b);

如果该项目不是 4,它旨在从数组 a 中推出随机项目。 但是如果我们滚动几次,我们会发现它实际上并没有阻止 4 到达数组 b。为什么?我认为它会像这样工作:

  1. 从数组 a 中滚动随机项目,将其存储到 c 并将 c 推到 b;
  2. 检查 (c===4) 是否为 true;
  3. 如果是——转到第 1 段;
  4. 如果不是 — 记录 b 到控制台。

我哪里弄错了,为什么这段代码会这样工作?如果这种方法不能帮助我,还有什么其他方法可以 'ban' 随机滚动数组中的某些项目(过滤数组除外)?

边跑边做,然后检查。所以它将从 A 中获取一个随机数,将其存储在 C 中并将其推送到 B,然后如果 C 为 4,它将执行另一个循环。

所以如果C是4,它仍然会把它推到B,只是之后就不会继续了。

你可以这样做:

var a = [1,2,3,4,5];
var b = [];
var c = a[Math.floor(Math.random()*a.length)];
while (c !== 4) {
  b.push(c);
  c = a[Math.floor(Math.random()*a.length)];
}
console.log(b);

我想这就是你想要做的?连续将随机项目从 A 推入 B,除非得到结果 4,在这种情况下,退出并转到 console.log?

正如评论者所解释的那样,您仍在推动 4。您可以通过非常明确地说明什么时候会发生什么来避免它。

var a = [1,2,3,4,5];
var b = [];
var c;
var keep_going = true;
while (keep_going) {
    c = a[Math.floor(Math.random()*a.length)];
    if (c === 4) {
        keep_going = false;
    } else {
        b.push(c);
    }
}
console.log(b);

所以按照您的代码编写方式,您不会 "bannning" 4 被添加到 b。您编写的代码将从 ab 的值相加,如果相加的值等于 4,则继续从 ab 的值相加,直到最后一个值添加不等于 4。因此您将得到如下结果:

b == [1];
b == [5];
b == [4,1];
b == [4,4,4,4,4,4,3];

由于 do-while 是一种循环机制,我假设您想继续尝试从 ab 添加一个值,直到找到一个不是 4 的值。那将是

var a = [1,2,3,4,5],
    b = [],
    c;
do {
    c = a[Math.floor(Math.random()*a.length)];
    if(c!==4) { b.push(c); }
} while(c===4);
console.log(b);

这将为 b

生成以下值
b == [1];
b == [2];
b == [3];
b == [5];