在逻辑运算符之后弹出不减少array.length

时间:2011-11-10 21:24:53

标签: javascript arrays while-loop logical-operators

我有这种我从未见过并且不明白的眩晕行为。我正在使用arrayname.length作为while循环的控件来完成一个数组。这通常按预期工作,但是当数组的长度没有减少到超过第一次迭代时,这种特殊情况会产生无限循环。

while( data.length > 0){
    finalCheck = finalCheck && data.pop();
}

这里,初始长度为4,finalCheck从true开始。前几个数组元素是假的。

正如第一次迭代所预期的那样,finalCheck变为false而data.length变为3但随后每次迭代data.length都保持在3 ...有谁知道为什么会发生这种情况?

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初始化truefinalCheck也会设置为零,并再次被卡住。

要修复代码,您至少应该使用:

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();
}