我的理解是while条件的内容在条件为真时执行。在使用一本很棒的O'Riely书中的一个例子时,我遇到了while循环的这个实现......
window.onload = function(){
var next, previous, rewind; // globals
(function(){
// Set private variables
var index = -1;
var data = ['eeny', 'meeny', 'miney', 'moe'];
var count = data.length;
next = function(){
if (index < count) {
index ++;
};
return data[index];
};
previous = function(){
if (index <= count){
index --;
}
return data[index];
};
rewind = function(){
index = -1;
};
})();
// console.log results of while loop calling next()...
var a;
rewind();
while(a = next()){
// do something here
console.log(a);
}
}
我想我想知道为什么在这段代码中,while循环无法无限地解析为true? var变量索引停止递增后,函数next()没有返回false(++),是吗?控制台不应该输出eeny,meeny,miney,moe,moe,moe,moe .....等......
我知道这可能是以某种形式提出的,但已经完成了搜索,无法找到解释使用while (a = function()) {// do something}
的问题或答案,以及在一次通过数组后该循环是如何停止的。
答案 0 :(得分:3)
关于为什么while (a = next()) {/*do something*/}
不会无限重复,它是关于强制为false的计数 - 参数在被while循环测试之前被转换为布尔值。强迫虚假的事情包括0
,-0
,undefined
,null
,""
,NaN
,当然还有false
本身。
当你指定某个东西时,它会返回赋值本身的值。例如,如果您执行以下操作:
var a;
console.log(a = '1234567890abcdefghijklmnopqrstuvwxyz');
它会记录1234567890abcdefghijklmnopqrstuvwxyz
。
当next
执行index++
时,会增加data
数组中元素索引的计数器。这意味着每次运行next()
函数时它都会在数据数组中查找下一个元素 - 如果没有更多元素,它将返回undefined
,从而结束循环。
例如,请看:
var index = 0;
data = ['a','b','c'];
data[index]; // 'a'
index++;
data[index]; // 'b'
index++;
data[index]; // 'c'
index++;
data[index]; // undefined - if passed this will coerce to false and end the loop
Boolean(data[index]); // false
答案 1 :(得分:1)
if (index < count) {
index ++;
};
当index
为count - 1
时,这仍然会将index
更改为count
,对吧? count
是data.length
。那么,它就这样做了:
return data[index];
哪个成为
return data[data.length];
由于数组的长度超出了数组的范围(它们从零开始),因此它将给出undefined
。
while(a = next()){
将成为
while(a = undefined){
由于undefined
是一个假值,因此不会输入循环。
答案 2 :(得分:1)
没有
它不会是一个无限循环。 while循环基本上是通过数组并输出它,当它在数组的末尾时它只返回false并退出循环。
这就像是;
foreach(a as nextArray)
{
//output
}
希望这有帮助。