我有这种我从未见过并且不明白的眩晕行为。我正在使用arrayname.length作为while循环的控件来完成一个数组。这通常按预期工作,但是当数组的长度没有减少到超过第一次迭代时,这种特殊情况会产生无限循环。
while( data.length > 0){
finalCheck = finalCheck && data.pop();
}
这里,初始长度为4,finalCheck从true开始。前几个数组元素是假的。
正如第一次迭代所预期的那样,finalCheck变为false而data.length变为3但随后每次迭代data.length都保持在3 ...有谁知道为什么会发生这种情况?
答案 0 :(得分:1)
如果finalCheck
变为false,为什么data.pop()
需要执行? JavaScript解释器正确地短路,而不是评估表达式的右侧。
如果您尝试等到finalCheck
为真,则可能需要使用||
运算符:
finalCheck = false; // initially anyway
while( data.length > 0 && !finalCheck){
finalCheck = finalCheck || data.pop();
}
你还需要确保在达到终止条件时突破循环!
答案 1 :(得分:1)
finalCheck
在某些时候变为false,导致data.pop()
无法执行。然后,循环变为无限。
data.pop()
从数组中返回已删除的元素。如果它是一个评估为false的值,则在下一次迭代中不会删除任何元素,导致data.length
始终高于零。
var data = [0, 1], finalCheck = false;
while( data.length > 0){
finalCheck = finalCheck && data.pop(); //Hello infinite loop
}
在前面显示的示例中,finalCheck
在迭代之前已经是false
,导致永远不会执行data.pop()
。即使在finalCheck
初始化true
,finalCheck
也会设置为零,并再次被卡住。
要修复代码,您至少应该使用:
while( data.length > 0 && finalCheck){
finalCheck = data.pop(); //Bye infinite loop
}
答案 2 :(得分:1)
循环中的条件使用短路&&
运算符,因此只要pop
为假,就不会再调用finalCheck
。
只要finalCheck
变为假,您就可以跳过循环。一旦它是假的,它将永远不会再成为现实,因此没有理由继续这一点:
while (finalCheck && data.length > 0) {
finalCheck = finalCheck && data.pop();
}