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
。为什么?我认为它会像这样工作:
- 从数组
a
中滚动随机项目,将其存储到 c
并将 c
推到 b
;
- 检查
(c===4)
是否为 true
;
- 如果是——转到第 1 段;
- 如果不是 — 记录
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
。您编写的代码将从 a
到 b
的值相加,如果相加的值等于 4,则继续从 a
到 b
的值相加,直到最后一个值添加不等于 4。因此您将得到如下结果:
b == [1];
b == [5];
b == [4,1];
b == [4,4,4,4,4,4,3];
由于 do-while
是一种循环机制,我假设您想继续尝试从 a
到 b
添加一个值,直到找到一个不是 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];
在我看来,我误解了 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
。为什么?我认为它会像这样工作:
- 从数组
a
中滚动随机项目,将其存储到c
并将c
推到b
; - 检查
(c===4)
是否为true
; - 如果是——转到第 1 段;
- 如果不是 — 记录
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
。您编写的代码将从 a
到 b
的值相加,如果相加的值等于 4,则继续从 a
到 b
的值相加,直到最后一个值添加不等于 4。因此您将得到如下结果:
b == [1];
b == [5];
b == [4,1];
b == [4,4,4,4,4,4,3];
由于 do-while
是一种循环机制,我假设您想继续尝试从 a
到 b
添加一个值,直到找到一个不是 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];