Javascript while循环,函数作为条件

时间:2013-11-16 02:53:45

标签: javascript function loops while-loop

我的理解是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}的问题或答案,以及在一次通过数组后该循环是如何停止的。

3 个答案:

答案 0 :(得分:3)

关于为什么while (a = next()) {/*do something*/}不会无限重复,它是关于强制为false的计数 - 参数在被while循环测试之前被转换为布尔值。强迫虚假的事情包括0-0undefinednull""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 ++;
};

indexcount - 1时,这仍然会将index更改为count,对吧? countdata.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
}

希望这有帮助。