我的理解是,虽然条件为真,但会执行while循环的内容。在研究一本令人敬畏的O‘’Riely书中的一个例子时,我遇到了this循环的这个实现.
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?函数next()在var索引停止增量(++)后不会返回false,对吗?控制台不应该只输出eeny,meeny,miney,moe,moe.....etc.
我知道这可能是以某种形式提出的,但是已经做了搜索,找不到一个问题或答案来解释如何使用while (a = function()) {// do something}和这个循环是如何在一次遍历数组之后停止的。
发布于 2013-11-16 02:56:05
关于为什么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发布于 2013-11-16 02:56:53
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是一个假值,所以不会输入循环。
发布于 2013-11-16 02:59:37
不,
它不会是一个无限的循环。while循环基本上是遍历数组并输出它,当它位于数组的末尾时,它只返回false并退出循环。
这有点像;
foreach(a as nextArray)
{
//output
}希望这能有所帮助。
https://stackoverflow.com/questions/20014061
复制相似问题